Unified · Split
| @@ -1436,6 +1436,7 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) · 1435 unmodified lines | |||
| 1436 | ret = ioprio_check_cap(iocb->aio_reqprio); | 1436 | ret = ioprio_check_cap(iocb->aio_reqprio); |
| 1437 | if (ret) { | 1437 | if (ret) { |
| 1438 | pr_debug("aio ioprio check cap error: %d\n", ret); | 1438 | pr_debug("aio ioprio check cap error: %d\n", ret); |
| 1439 | fput(req->ki_filp); | ||
| 1439 | return ret; | 1440 | return ret; |
| 1440 | } | 1441 | } |
| 1441 | 1442 | ||
| @@ -77,7 +77,7 @@ static bool dentry_connected(struct dentry *dentry) · 76 unmodified lines | |||
| 77 | struct dentry *parent = dget_parent(dentry); | 77 | struct dentry *parent = dget_parent(dentry); |
| 78 | 78 | ||
| 79 | dput(dentry); | 79 | dput(dentry); |
| 80 | if (IS_ROOT(dentry)) { | 80 | if (dentry == parent) { |
| 81 | dput(parent); | 81 | dput(parent); |
| 82 | return false; | 82 | return false; |
| 83 | } | 83 | } |
| @@ -147,6 +147,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, · 63 unmodified lines | |||
| 147 | tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); | 147 | tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); |
| 148 | if (IS_ERR(tmp)) { | 148 | if (IS_ERR(tmp)) { |
| 149 | dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); | 149 | dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); |
| 150 | err = PTR_ERR(tmp); | ||
| 150 | goto out_err; | 151 | goto out_err; |
| 151 | } | 152 | } |
| 152 | if (tmp != dentry) { | 153 | if (tmp != dentry) { |
| @@ -275,7 +275,7 @@ static int __sysv_write_inode(struct inode *inode, int wait) · 274 unmodified lines | |||
| 275 | } | 275 | } |
| 276 | } | 276 | } |
| 277 | brelse(bh); | 277 | brelse(bh); |
| 278 | return 0; | 278 | return err; |
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | int sysv_write_inode(struct inode *inode, struct writeback_control *wbc) | 281 | int sysv_write_inode(struct inode *inode, struct writeback_control *wbc) |
| @@ -560,6 +560,44 @@ static size_t copy_pipe_to_iter(const void *addr, size_t bytes, · 559 unmodified lines | |||
| 560 | return bytes; | 560 | return bytes; |
| 561 | } | 561 | } |
| 562 | 562 | ||
| 563 | static __wsum csum_and_memcpy(void *to, const void *from, size_t len, | ||
| 564 | __wsum sum, size_t off) | ||
| 565 | { | ||
| 566 | __wsum next = csum_partial_copy_nocheck(from, to, len, 0); | ||
| 567 | return csum_block_add(sum, next, off); | ||
| 568 | } | ||
| 569 | |||
| 570 | static size_t csum_and_copy_to_pipe_iter(const void *addr, size_t bytes, | ||
| 571 | __wsum *csum, struct iov_iter *i) | ||
| 572 | { | ||
| 573 | struct pipe_inode_info *pipe = i->pipe; | ||
| 574 | size_t n, r; | ||
| 575 | size_t off = 0; | ||
| 576 | __wsum sum = *csum; | ||
| 577 | int idx; | ||
| 578 | |||
| 579 | if (!sanity(i)) | ||
| 580 | return 0; | ||
| 581 | |||
| 582 | bytes = n = push_pipe(i, bytes, &idx, &r); | ||
| 583 | if (unlikely(!n)) | ||
| 584 | return 0; | ||
| 585 | for ( ; n; idx = next_idx(idx, pipe), r = 0) { | ||
| 586 | size_t chunk = min_t(size_t, n, PAGE_SIZE - r); | ||
| 587 | char *p = kmap_atomic(pipe->bufs[idx].page); | ||
| 588 | sum = csum_and_memcpy(p + r, addr, chunk, sum, off); | ||
| 589 | kunmap_atomic(p); | ||
| 590 | i->idx = idx; | ||
| 591 | i->iov_offset = r + chunk; | ||
| 592 | n -= chunk; | ||
| 593 | off += chunk; | ||
| 594 | addr += chunk; | ||
| 595 | } | ||
| 596 | i->count -= bytes; | ||
| 597 | *csum = sum; | ||
| 598 | return bytes; | ||
| 599 | } | ||
| 600 | |||
| 563 | size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) | 601 | size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) |
| 564 | { | 602 | { |
| 565 | const char *from = addr; | 603 | const char *from = addr; |
| @@ -1368,17 +1406,15 @@ size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, · 802 unmodified lines | |||
| 1368 | err ? v.iov_len : 0; | 1406 | err ? v.iov_len : 0; |
| 1369 | }), ({ | 1407 | }), ({ |
| 1370 | char *p = kmap_atomic(v.bv_page); | 1408 | char *p = kmap_atomic(v.bv_page); |
| 1371 | next = csum_partial_copy_nocheck(p + v.bv_offset, | 1409 | sum = csum_and_memcpy((to += v.bv_len) - v.bv_len, |
| 1372 | (to += v.bv_len) - v.bv_len, | 1410 | p + v.bv_offset, v.bv_len, |
| 1373 | v.bv_len, 0); | 1411 | sum, off); |
| 1374 | kunmap_atomic(p); | 1412 | kunmap_atomic(p); |
| 1375 | sum = csum_block_add(sum, next, off); | ||
| 1376 | off += v.bv_len; | 1413 | off += v.bv_len; |
| 1377 | }),({ | 1414 | }),({ |
| 1378 | next = csum_partial_copy_nocheck(v.iov_base, | 1415 | sum = csum_and_memcpy((to += v.iov_len) - v.iov_len, |
| 1379 | (to += v.iov_len) - v.iov_len, | 1416 | v.iov_base, v.iov_len, |
| 1380 | v.iov_len, 0); | 1417 | sum, off); |
| 1381 | sum = csum_block_add(sum, next, off); | ||
| 1382 | off += v.iov_len; | 1418 | off += v.iov_len; |
| 1383 | }) | 1419 | }) |
| 1384 | ) | 1420 | ) |
| @@ -1412,17 +1448,15 @@ bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum, · 27 unmodified lines | |||
| 1412 | 0; | 1448 | 0; |
| 1413 | }), ({ | 1449 | }), ({ |
| 1414 | char *p = kmap_atomic(v.bv_page); | 1450 | char *p = kmap_atomic(v.bv_page); |
| 1415 | next = csum_partial_copy_nocheck(p + v.bv_offset, | 1451 | sum = csum_and_memcpy((to += v.bv_len) - v.bv_len, |
| 1416 | (to += v.bv_len) - v.bv_len, | 1452 | p + v.bv_offset, v.bv_len, |
| 1417 | v.bv_len, 0); | 1453 | sum, off); |
| 1418 | kunmap_atomic(p); | 1454 | kunmap_atomic(p); |
| 1419 | sum = csum_block_add(sum, next, off); | ||
| 1420 | off += v.bv_len; | 1455 | off += v.bv_len; |
| 1421 | }),({ | 1456 | }),({ |
| 1422 | next = csum_partial_copy_nocheck(v.iov_base, | 1457 | sum = csum_and_memcpy((to += v.iov_len) - v.iov_len, |
| 1423 | (to += v.iov_len) - v.iov_len, | 1458 | v.iov_base, v.iov_len, |
| 1424 | v.iov_len, 0); | 1459 | sum, off); |
| 1425 | sum = csum_block_add(sum, next, off); | ||
| 1426 | off += v.iov_len; | 1460 | off += v.iov_len; |
| 1427 | }) | 1461 | }) |
| 1428 | ) | 1462 | ) |
| @@ -1438,8 +1472,12 @@ size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum, · 9 unmodified lines | |||
| 1438 | const char *from = addr; | 1472 | const char *from = addr; |
| 1439 | __wsum sum, next; | 1473 | __wsum sum, next; |
| 1440 | size_t off = 0; | 1474 | size_t off = 0; |
| 1475 | |||
| 1476 | if (unlikely(iov_iter_is_pipe(i))) | ||
| 1477 | return csum_and_copy_to_pipe_iter(addr, bytes, csum, i); | ||
| 1478 | |||
| 1441 | sum = *csum; | 1479 | sum = *csum; |
| 1442 | if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) { | 1480 | if (unlikely(iov_iter_is_discard(i))) { |
| 1443 | WARN_ON(1); /* for now */ | 1481 | WARN_ON(1); /* for now */ |
| 1444 | return 0; | 1482 | return 0; |
| 1445 | } | 1483 | } |
| @@ -1455,17 +1493,15 @@ size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum, · 9 unmodified lines | |||
| 1455 | err ? v.iov_len : 0; | 1493 | err ? v.iov_len : 0; |
| 1456 | }), ({ | 1494 | }), ({ |
| 1457 | char *p = kmap_atomic(v.bv_page); | 1495 | char *p = kmap_atomic(v.bv_page); |
| 1458 | next = csum_partial_copy_nocheck((from += v.bv_len) - v.bv_len, | 1496 | sum = csum_and_memcpy(p + v.bv_offset, |
| 1459 | p + v.bv_offset, | 1497 | (from += v.bv_len) - v.bv_len, |
| 1460 | v.bv_len, 0); | 1498 | v.bv_len, sum, off); |
| 1461 | kunmap_atomic(p); | 1499 | kunmap_atomic(p); |
| 1462 | sum = csum_block_add(sum, next, off); | ||
| 1463 | off += v.bv_len; | 1500 | off += v.bv_len; |
| 1464 | }),({ | 1501 | }),({ |
| 1465 | next = csum_partial_copy_nocheck((from += v.iov_len) - v.iov_len, | 1502 | sum = csum_and_memcpy(v.iov_base, |
| 1466 | v.iov_base, | 1503 | (from += v.iov_len) - v.iov_len, |
| 1467 | v.iov_len, 0); | 1504 | v.iov_len, sum, off); |
| 1468 | sum = csum_block_add(sum, next, off); | ||
| 1469 | off += v.iov_len; | 1505 | off += v.iov_len; |
| 1470 | }) | 1506 | }) |
| 1471 | ) | 1507 | ) |
| @@ -19,8 +19,6 @@ struct security_class_mapping { · 18 unmodified lines | |||
| 19 | #include "classmap.h" | 19 | #include "classmap.h" |
| 20 | #include "initial_sid_to_string.h" | 20 | #include "initial_sid_to_string.h" |
| 21 | 21 | ||
| 22 | #define max(x, y) (((int)(x) > (int)(y)) ? x : y) | ||
| 23 | |||
| 24 | const char *progname; | 22 | const char *progname; |
| 25 | 23 | ||
| 26 | static void usage(void) | 24 | static void usage(void) |
| @@ -46,11 +44,9 @@ static char *stoupperx(const char *s) · 19 unmodified lines | |||
| 46 | 44 | ||
| 47 | int main(int argc, char *argv[]) | 45 | int main(int argc, char *argv[]) |
| 48 | { | 46 | { |
| 49 | int i, j, k; | 47 | int i, j; |
| 50 | int isids_len; | 48 | int isids_len; |
| 51 | FILE *fout; | 49 | FILE *fout; |
| 52 | const char *needle = "SOCKET"; | ||
| 53 | char *substr; | ||
| 54 | 50 | ||
| 55 | progname = argv[0]; | 51 | progname = argv[0]; |
| 56 | 52 | ||
| @@ -80,20 +76,14 @@ int main(int argc, char *argv[]) · 23 unmodified lines | |||
| 80 | 76 | ||
| 81 | for (i = 0; secclass_map[i].name; i++) { | 77 | for (i = 0; secclass_map[i].name; i++) { |
| 82 | struct security_class_mapping *map = &secclass_map[i]; | 78 | struct security_class_mapping *map = &secclass_map[i]; |
| 83 | fprintf(fout, "#define SECCLASS_%s", map->name); | 79 | fprintf(fout, "#define SECCLASS_%-39s %2d\n", map->name, i+1); |
| 84 | for (j = 0; j < max(1, 40 - strlen(map->name)); j++) | ||
| 85 | fprintf(fout, " "); | ||
| 86 | fprintf(fout, "%2d\n", i+1); | ||
| 87 | } | 80 | } |
| 88 | 81 | ||
| 89 | fprintf(fout, "\n"); | 82 | fprintf(fout, "\n"); |
| 90 | 83 | ||
| 91 | for (i = 1; i < isids_len; i++) { | 84 | for (i = 1; i < isids_len; i++) { |
| 92 | const char *s = initial_sid_to_string[i]; | 85 | const char *s = initial_sid_to_string[i]; |
| 93 | fprintf(fout, "#define SECINITSID_%s", s); | 86 | fprintf(fout, "#define SECINITSID_%-39s %2d\n", s, i); |
| 94 | for (j = 0; j < max(1, 40 - strlen(s)); j++) | ||
| 95 | fprintf(fout, " "); | ||
| 96 | fprintf(fout, "%2d\n", i); | ||
| 97 | } | 87 | } |
| 98 | fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1); | 88 | fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1); |
| 99 | fprintf(fout, "\nstatic inline bool security_is_socket_class(u16 kern_tclass)\n"); | 89 | fprintf(fout, "\nstatic inline bool security_is_socket_class(u16 kern_tclass)\n"); |
| @@ -101,9 +91,10 @@ int main(int argc, char *argv[]) · 1 unmodified line | |||
| 101 | fprintf(fout, "\tbool sock = false;\n\n"); | 91 | fprintf(fout, "\tbool sock = false;\n\n"); |
| 102 | fprintf(fout, "\tswitch (kern_tclass) {\n"); | 92 | fprintf(fout, "\tswitch (kern_tclass) {\n"); |
| 103 | for (i = 0; secclass_map[i].name; i++) { | 93 | for (i = 0; secclass_map[i].name; i++) { |
| 94 | static char s[] = "SOCKET"; | ||
| 104 | struct security_class_mapping *map = &secclass_map[i]; | 95 | struct security_class_mapping *map = &secclass_map[i]; |
| 105 | substr = strstr(map->name, needle); | 96 | int len = strlen(map->name), l = sizeof(s) - 1; |
| 106 | if (substr && strcmp(substr, needle) == 0) | 97 | if (len >= l && memcmp(map->name + len - l, s, l) == 0) |
| 107 | fprintf(fout, "\tcase SECCLASS_%s:\n", map->name); | 98 | fprintf(fout, "\tcase SECCLASS_%s:\n", map->name); |
| 108 | } | 99 | } |
| 109 | fprintf(fout, "\t\tsock = true;\n"); | 100 | fprintf(fout, "\t\tsock = true;\n"); |
| @@ -129,17 +120,15 @@ int main(int argc, char *argv[]) · 19 unmodified lines | |||
| 129 | 120 | ||
| 130 | for (i = 0; secclass_map[i].name; i++) { | 121 | for (i = 0; secclass_map[i].name; i++) { |
| 131 | struct security_class_mapping *map = &secclass_map[i]; | 122 | struct security_class_mapping *map = &secclass_map[i]; |
| 123 | int len = strlen(map->name); | ||
| 132 | for (j = 0; map->perms[j]; j++) { | 124 | for (j = 0; map->perms[j]; j++) { |
| 133 | if (j >= 32) { | 125 | if (j >= 32) { |
| 134 | fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n", | 126 | fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n", |
| 135 | map->name, map->perms[j]); | 127 | map->name, map->perms[j]); |
| 136 | exit(5); | 128 | exit(5); |
| 137 | } | 129 | } |
| 138 | fprintf(fout, "#define %s__%s", map->name, | 130 | fprintf(fout, "#define %s__%-*s 0x%08xU\n", map->name, |
| 139 | map->perms[j]); | 131 | 39-len, map->perms[j], 1U<<j); |
| 140 | for (k = 0; k < max(1, 40 - strlen(map->name) - strlen(map->perms[j])); k++) | ||
| 141 | fprintf(fout, " "); | ||
| 142 | fprintf(fout, "0x%08xU\n", (1<<j)); | ||
| 143 | } | 132 | } |
| 144 | } | 133 | } |
| 145 | 134 | ||