Unified · Split
| @@ -1436,6 +1436,7 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) · 1435 unmodified lines | ||
| 1436 | 1436 | ret = ioprio_check_cap(iocb->aio_reqprio); |
| 1437 | 1437 | if (ret) { |
| 1438 | 1438 | pr_debug("aio ioprio check cap error: %d\n", ret); |
| 1439 | + fput(req->ki_filp); | |
| 1439 | 1440 | return ret; |
| 1440 | 1441 | } |
| 1441 | 1442 | |
| @@ -77,7 +77,7 @@ static bool dentry_connected(struct dentry *dentry) · 76 unmodified lines | ||
| 77 | 77 | struct dentry *parent = dget_parent(dentry); |
| 78 | 78 | |
| 79 | 79 | dput(dentry); |
| 80 | − if (IS_ROOT(dentry)) { | |
| 80 | + if (dentry == parent) { | |
| 81 | 81 | dput(parent); |
| 82 | 82 | return false; |
| 83 | 83 | } |
| @@ -147,6 +147,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, · 63 unmodified lines | ||
| 147 | 147 | tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); |
| 148 | 148 | if (IS_ERR(tmp)) { |
| 149 | 149 | dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); |
| 150 | + err = PTR_ERR(tmp); | |
| 150 | 151 | goto out_err; |
| 151 | 152 | } |
| 152 | 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 | 277 | brelse(bh); |
| 278 | − return 0; | |
| 278 | + return err; | |
| 279 | 279 | } |
| 280 | 280 | |
| 281 | 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 | 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 | 601 | size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) |
| 564 | 602 | { |
| 565 | 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 | 1406 | err ? v.iov_len : 0; |
| 1369 | 1407 | }), ({ |
| 1370 | 1408 | char *p = kmap_atomic(v.bv_page); |
| 1371 | − next = csum_partial_copy_nocheck(p + v.bv_offset, | |
| 1372 | − (to += v.bv_len) - v.bv_len, | |
| 1373 | − v.bv_len, 0); | |
| 1409 | + sum = csum_and_memcpy((to += v.bv_len) - v.bv_len, | |
| 1410 | + p + v.bv_offset, v.bv_len, | |
| 1411 | + sum, off); | |
| 1374 | 1412 | kunmap_atomic(p); |
| 1375 | − sum = csum_block_add(sum, next, off); | |
| 1376 | 1413 | off += v.bv_len; |
| 1377 | 1414 | }),({ |
| 1378 | − next = csum_partial_copy_nocheck(v.iov_base, | |
| 1379 | − (to += v.iov_len) - v.iov_len, | |
| 1380 | − v.iov_len, 0); | |
| 1381 | − sum = csum_block_add(sum, next, off); | |
| 1415 | + sum = csum_and_memcpy((to += v.iov_len) - v.iov_len, | |
| 1416 | + v.iov_base, v.iov_len, | |
| 1417 | + sum, off); | |
| 1382 | 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 | 1448 | 0; |
| 1413 | 1449 | }), ({ |
| 1414 | 1450 | char *p = kmap_atomic(v.bv_page); |
| 1415 | − next = csum_partial_copy_nocheck(p + v.bv_offset, | |
| 1416 | − (to += v.bv_len) - v.bv_len, | |
| 1417 | − v.bv_len, 0); | |
| 1451 | + sum = csum_and_memcpy((to += v.bv_len) - v.bv_len, | |
| 1452 | + p + v.bv_offset, v.bv_len, | |
| 1453 | + sum, off); | |
| 1418 | 1454 | kunmap_atomic(p); |
| 1419 | − sum = csum_block_add(sum, next, off); | |
| 1420 | 1455 | off += v.bv_len; |
| 1421 | 1456 | }),({ |
| 1422 | − next = csum_partial_copy_nocheck(v.iov_base, | |
| 1423 | − (to += v.iov_len) - v.iov_len, | |
| 1424 | − v.iov_len, 0); | |
| 1425 | − sum = csum_block_add(sum, next, off); | |
| 1457 | + sum = csum_and_memcpy((to += v.iov_len) - v.iov_len, | |
| 1458 | + v.iov_base, v.iov_len, | |
| 1459 | + sum, off); | |
| 1426 | 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 | 1472 | const char *from = addr; |
| 1439 | 1473 | __wsum sum, next; |
| 1440 | 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 | 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 | 1481 | WARN_ON(1); /* for now */ |
| 1444 | 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 | 1493 | err ? v.iov_len : 0; |
| 1456 | 1494 | }), ({ |
| 1457 | 1495 | char *p = kmap_atomic(v.bv_page); |
| 1458 | − next = csum_partial_copy_nocheck((from += v.bv_len) - v.bv_len, | |
| 1459 | − p + v.bv_offset, | |
| 1460 | − v.bv_len, 0); | |
| 1496 | + sum = csum_and_memcpy(p + v.bv_offset, | |
| 1497 | + (from += v.bv_len) - v.bv_len, | |
| 1498 | + v.bv_len, sum, off); | |
| 1461 | 1499 | kunmap_atomic(p); |
| 1462 | − sum = csum_block_add(sum, next, off); | |
| 1463 | 1500 | off += v.bv_len; |
| 1464 | 1501 | }),({ |
| 1465 | − next = csum_partial_copy_nocheck((from += v.iov_len) - v.iov_len, | |
| 1466 | − v.iov_base, | |
| 1467 | − v.iov_len, 0); | |
| 1468 | − sum = csum_block_add(sum, next, off); | |
| 1502 | + sum = csum_and_memcpy(v.iov_base, | |
| 1503 | + (from += v.iov_len) - v.iov_len, | |
| 1504 | + v.iov_len, sum, off); | |
| 1469 | 1505 | off += v.iov_len; |
| 1470 | 1506 | }) |
| 1471 | 1507 | ) |
| @@ -19,8 +19,6 @@ struct security_class_mapping { · 18 unmodified lines | ||
| 19 | 19 | #include "classmap.h" |
| 20 | 20 | #include "initial_sid_to_string.h" |
| 21 | 21 | |
| 22 | −#define max(x, y) (((int)(x) > (int)(y)) ? x : y) | |
| 23 | − | |
| 24 | 22 | const char *progname; |
| 25 | 23 | |
| 26 | 24 | static void usage(void) |
| @@ -46,11 +44,9 @@ static char *stoupperx(const char *s) · 19 unmodified lines | ||
| 46 | 44 | |
| 47 | 45 | int main(int argc, char *argv[]) |
| 48 | 46 | { |
| 49 | − int i, j, k; | |
| 47 | + int i, j; | |
| 50 | 48 | int isids_len; |
| 51 | 49 | FILE *fout; |
| 52 | − const char *needle = "SOCKET"; | |
| 53 | − char *substr; | |
| 54 | 50 | |
| 55 | 51 | progname = argv[0]; |
| 56 | 52 | |
| @@ -80,20 +76,14 @@ int main(int argc, char *argv[]) · 23 unmodified lines | ||
| 80 | 76 | |
| 81 | 77 | for (i = 0; secclass_map[i].name; i++) { |
| 82 | 78 | struct security_class_mapping *map = &secclass_map[i]; |
| 83 | − fprintf(fout, "#define SECCLASS_%s", map->name); | |
| 84 | − for (j = 0; j < max(1, 40 - strlen(map->name)); j++) | |
| 85 | − fprintf(fout, " "); | |
| 86 | − fprintf(fout, "%2d\n", i+1); | |
| 79 | + fprintf(fout, "#define SECCLASS_%-39s %2d\n", map->name, i+1); | |
| 87 | 80 | } |
| 88 | 81 | |
| 89 | 82 | fprintf(fout, "\n"); |
| 90 | 83 | |
| 91 | 84 | for (i = 1; i < isids_len; i++) { |
| 92 | 85 | const char *s = initial_sid_to_string[i]; |
| 93 | − fprintf(fout, "#define SECINITSID_%s", s); | |
| 94 | − for (j = 0; j < max(1, 40 - strlen(s)); j++) | |
| 95 | − fprintf(fout, " "); | |
| 96 | − fprintf(fout, "%2d\n", i); | |
| 86 | + fprintf(fout, "#define SECINITSID_%-39s %2d\n", s, i); | |
| 97 | 87 | } |
| 98 | 88 | fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1); |
| 99 | 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 | 91 | fprintf(fout, "\tbool sock = false;\n\n"); |
| 102 | 92 | fprintf(fout, "\tswitch (kern_tclass) {\n"); |
| 103 | 93 | for (i = 0; secclass_map[i].name; i++) { |
| 94 | + static char s[] = "SOCKET"; | |
| 104 | 95 | struct security_class_mapping *map = &secclass_map[i]; |
| 105 | − substr = strstr(map->name, needle); | |
| 106 | − if (substr && strcmp(substr, needle) == 0) | |
| 96 | + int len = strlen(map->name), l = sizeof(s) - 1; | |
| 97 | + if (len >= l && memcmp(map->name + len - l, s, l) == 0) | |
| 107 | 98 | fprintf(fout, "\tcase SECCLASS_%s:\n", map->name); |
| 108 | 99 | } |
| 109 | 100 | fprintf(fout, "\t\tsock = true;\n"); |
| @@ -129,17 +120,15 @@ int main(int argc, char *argv[]) · 19 unmodified lines | ||
| 129 | 120 | |
| 130 | 121 | for (i = 0; secclass_map[i].name; i++) { |
| 131 | 122 | struct security_class_mapping *map = &secclass_map[i]; |
| 123 | + int len = strlen(map->name); | |
| 132 | 124 | for (j = 0; map->perms[j]; j++) { |
| 133 | 125 | if (j >= 32) { |
| 134 | 126 | fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n", |
| 135 | 127 | map->name, map->perms[j]); |
| 136 | 128 | exit(5); |
| 137 | 129 | } |
| 138 | − fprintf(fout, "#define %s__%s", map->name, | |
| 139 | − map->perms[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)); | |
| 130 | + fprintf(fout, "#define %s__%-*s 0x%08xU\n", map->name, | |
| 131 | + 39-len, map->perms[j], 1U<<j); | |
| 143 | 132 | } |
| 144 | 133 | } |
| 145 | 134 | |