Commit a21b2733a964bcb3649d78bb7afd23c15dce3d96

Authored by Danny Al-Gaaf
1 parent 31810e1f
Exists in master

jerasure.c: add more checks for talloc/malloc results

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
Showing 1 changed file with 91 additions and 0 deletions   Show diff stats
src/jerasure.c
@@ -245,6 +245,12 @@ int jerasure_matrix_decode(int k, int m, int w, int *matrix, int row_k_ones, int @@ -245,6 +245,12 @@ int jerasure_matrix_decode(int k, int m, int w, int *matrix, int row_k_ones, int
245 245
246 if (edd > 0) { 246 if (edd > 0) {
247 tmpids = talloc(int, k); 247 tmpids = talloc(int, k);
  248 + if (!tmpids) {
  249 + free(erased);
  250 + free(dm_ids);
  251 + free(decoding_matrix);
  252 + return -1;
  253 + }
248 for (i = 0; i < k; i++) { 254 for (i = 0; i < k; i++) {
249 tmpids[i] = (i < lastdrive) ? i : i+1; 255 tmpids[i] = (i < lastdrive) ? i : i+1;
250 } 256 }
@@ -697,6 +703,12 @@ int jerasure_bitmatrix_decode(int k, int m, int w, int *bitmatrix, int row_k_one @@ -697,6 +703,12 @@ int jerasure_bitmatrix_decode(int k, int m, int w, int *bitmatrix, int row_k_one
697 703
698 if (edd > 0) { 704 if (edd > 0) {
699 tmpids = talloc(int, k); 705 tmpids = talloc(int, k);
  706 + if (!tmpids) {
  707 + free(erased);
  708 + free(dm_ids);
  709 + free(decoding_matrix);
  710 + return -1;
  711 + }
700 for (i = 0; i < k; i++) { 712 for (i = 0; i < k; i++) {
701 tmpids[i] = (i < lastdrive) ? i : i+1; 713 tmpids[i] = (i < lastdrive) ? i : i+1;
702 } 714 }
@@ -748,6 +760,10 @@ static char **set_up_ptrs_for_scheduled_decoding(int k, int m, int *erasures, ch @@ -748,6 +760,10 @@ static char **set_up_ptrs_for_scheduled_decoding(int k, int m, int *erasures, ch
748 */ 760 */
749 761
750 ptrs = talloc(char *, k+m); 762 ptrs = talloc(char *, k+m);
  763 + if (!ptrs) {
  764 + free(erased);
  765 + return NULL;
  766 + }
751 767
752 j = k; 768 j = k;
753 x = k; 769 x = k;
@@ -837,7 +853,12 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma @@ -837,7 +853,12 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma
837 } 853 }
838 854
839 row_ids = talloc(int, k+m); 855 row_ids = talloc(int, k+m);
  856 + if (!row_ids) return NULL;
840 ind_to_row = talloc(int, k+m); 857 ind_to_row = talloc(int, k+m);
  858 + if (!ind_to_row) {
  859 + free(row_ids);
  860 + return NULL;
  861 + }
841 862
842 if (set_up_ids_for_scheduled_decoding(k, m, erasures, row_ids, ind_to_row) < 0) { 863 if (set_up_ids_for_scheduled_decoding(k, m, erasures, row_ids, ind_to_row) < 0) {
843 free(row_ids); 864 free(row_ids);
@@ -851,6 +872,11 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma @@ -851,6 +872,11 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma
851 number of erasures (ddf+cdf) */ 872 number of erasures (ddf+cdf) */
852 873
853 real_decoding_matrix = talloc(int, k*w*(cdf+ddf)*w); 874 real_decoding_matrix = talloc(int, k*w*(cdf+ddf)*w);
  875 + if (!real_decoding_matrix) {
  876 + free(row_ids);
  877 + free(ind_to_row);
  878 + return NULL;
  879 + }
854 880
855 /* First, if any data drives have failed, then initialize the first 881 /* First, if any data drives have failed, then initialize the first
856 ddf*w rows of the decoding matrix from the standard decoding 882 ddf*w rows of the decoding matrix from the standard decoding
@@ -859,6 +885,11 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma @@ -859,6 +885,11 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma
859 if (ddf > 0) { 885 if (ddf > 0) {
860 886
861 decoding_matrix = talloc(int, k*k*w*w); 887 decoding_matrix = talloc(int, k*k*w*w);
  888 + if (!decoding_matrix) {
  889 + free(row_ids);
  890 + free(ind_to_row);
  891 + return NULL;
  892 + }
862 ptr = decoding_matrix; 893 ptr = decoding_matrix;
863 for (i = 0; i < k; i++) { 894 for (i = 0; i < k; i++) {
864 if (row_ids[i] == i) { 895 if (row_ids[i] == i) {
@@ -872,6 +903,12 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma @@ -872,6 +903,12 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma
872 ptr += (k*w*w); 903 ptr += (k*w*w);
873 } 904 }
874 inverse = talloc(int, k*k*w*w); 905 inverse = talloc(int, k*k*w*w);
  906 + if (!inverse) {
  907 + free(row_ids);
  908 + free(ind_to_row);
  909 + free(decoding_matrix);
  910 + return NULL;
  911 + }
875 jerasure_invert_bitmatrix(decoding_matrix, inverse, k*w); 912 jerasure_invert_bitmatrix(decoding_matrix, inverse, k*w);
876 913
877 /* printf("\nMatrix to invert\n"); 914 /* printf("\nMatrix to invert\n");
@@ -1213,6 +1250,7 @@ int **jerasure_dumb_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1213,6 +1250,7 @@ int **jerasure_dumb_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1213 int index, optodo, i, j; 1250 int index, optodo, i, j;
1214 1251
1215 operations = talloc(int *, k*m*w*w+1); 1252 operations = talloc(int *, k*m*w*w+1);
  1253 + if (!operations) return NULL;
1216 op = 0; 1254 op = 0;
1217 1255
1218 index = 0; 1256 index = 0;
@@ -1221,6 +1259,10 @@ int **jerasure_dumb_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1221,6 +1259,10 @@ int **jerasure_dumb_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1221 for (j = 0; j < k*w; j++) { 1259 for (j = 0; j < k*w; j++) {
1222 if (bitmatrix[index]) { 1260 if (bitmatrix[index]) {
1223 operations[op] = talloc(int, 5); 1261 operations[op] = talloc(int, 5);
  1262 + if (!operations[op]) {
  1263 + // -ENOMEM
  1264 + goto error;
  1265 + }
1224 operations[op][4] = optodo; 1266 operations[op][4] = optodo;
1225 operations[op][0] = j/w; 1267 operations[op][0] = j/w;
1226 operations[op][1] = j%w; 1268 operations[op][1] = j%w;
@@ -1234,8 +1276,19 @@ int **jerasure_dumb_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1234,8 +1276,19 @@ int **jerasure_dumb_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1234 } 1276 }
1235 } 1277 }
1236 operations[op] = talloc(int, 5); 1278 operations[op] = talloc(int, 5);
  1279 + if (!operations[op]) {
  1280 + // -ENOMEM
  1281 + goto error;
  1282 + }
1237 operations[op][0] = -1; 1283 operations[op][0] = -1;
1238 return operations; 1284 return operations;
  1285 +
  1286 +error:
  1287 + for (i = 0; i <= op; i++) {
  1288 + free(operations[op]);
  1289 + }
  1290 + free(operations);
  1291 + return NULL;
1239 } 1292 }
1240 1293
1241 int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) 1294 int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
@@ -1252,12 +1305,35 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1252,12 +1305,35 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1252 jerasure_print_bitmatrix(bitmatrix, m*w, k*w, w); */ 1305 jerasure_print_bitmatrix(bitmatrix, m*w, k*w, w); */
1253 1306
1254 operations = talloc(int *, k*m*w*w+1); 1307 operations = talloc(int *, k*m*w*w+1);
  1308 + if (!operations) return NULL;
1255 op = 0; 1309 op = 0;
1256 1310
1257 diff = talloc(int, m*w); 1311 diff = talloc(int, m*w);
  1312 + if (!diff) {
  1313 + free(operations);
  1314 + return NULL;
  1315 + }
1258 from = talloc(int, m*w); 1316 from = talloc(int, m*w);
  1317 + if (!from) {
  1318 + free(operations);
  1319 + free(diff);
  1320 + return NULL;
  1321 + }
1259 flink = talloc(int, m*w); 1322 flink = talloc(int, m*w);
  1323 + if (!flink) {
  1324 + free(operations);
  1325 + free(diff);
  1326 + free(from);
  1327 + return NULL;
  1328 + }
1260 blink = talloc(int, m*w); 1329 blink = talloc(int, m*w);
  1330 + if (!blink) {
  1331 + free(operations);
  1332 + free(diff);
  1333 + free(from);
  1334 + free(flink);
  1335 + return NULL;
  1336 + }
1261 1337
1262 ptr = bitmatrix; 1338 ptr = bitmatrix;
1263 1339
@@ -1301,6 +1377,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1301,6 +1377,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1301 for (j = 0; j < k*w; j++) { 1377 for (j = 0; j < k*w; j++) {
1302 if (ptr[j]) { 1378 if (ptr[j]) {
1303 operations[op] = talloc(int, 5); 1379 operations[op] = talloc(int, 5);
  1380 + if (!operations[op]) goto error;
1304 operations[op][4] = optodo; 1381 operations[op][4] = optodo;
1305 operations[op][0] = j/w; 1382 operations[op][0] = j/w;
1306 operations[op][1] = j%w; 1383 operations[op][1] = j%w;
@@ -1312,6 +1389,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1312,6 +1389,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1312 } 1389 }
1313 } else { 1390 } else {
1314 operations[op] = talloc(int, 5); 1391 operations[op] = talloc(int, 5);
  1392 + if (!operations[op]) goto error;
1315 operations[op][4] = 0; 1393 operations[op][4] = 0;
1316 operations[op][0] = k+from[row]/w; 1394 operations[op][0] = k+from[row]/w;
1317 operations[op][1] = from[row]%w; 1395 operations[op][1] = from[row]%w;
@@ -1322,6 +1400,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1322,6 +1400,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1322 for (j = 0; j < k*w; j++) { 1400 for (j = 0; j < k*w; j++) {
1323 if (ptr[j] ^ b1[j]) { 1401 if (ptr[j] ^ b1[j]) {
1324 operations[op] = talloc(int, 5); 1402 operations[op] = talloc(int, 5);
  1403 + if (!operations[op]) goto error;
1325 operations[op][4] = 1; 1404 operations[op][4] = 1;
1326 operations[op][0] = j/w; 1405 operations[op][0] = j/w;
1327 operations[op][1] = j%w; 1406 operations[op][1] = j%w;
@@ -1349,6 +1428,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1349,6 +1428,7 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1349 } 1428 }
1350 1429
1351 operations[op] = talloc(int, 5); 1430 operations[op] = talloc(int, 5);
  1431 + if (!operations[op]) goto error;
1352 operations[op][0] = -1; 1432 operations[op][0] = -1;
1353 free(from); 1433 free(from);
1354 free(diff); 1434 free(diff);
@@ -1356,6 +1436,17 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix) @@ -1356,6 +1436,17 @@ int **jerasure_smart_bitmatrix_to_schedule(int k, int m, int w, int *bitmatrix)
1356 free(flink); 1436 free(flink);
1357 1437
1358 return operations; 1438 return operations;
  1439 +
  1440 +error:
  1441 + for (i = 0; i <= op; i++) {
  1442 + free(operations[op]);
  1443 + }
  1444 + free(operations);
  1445 + free(from);
  1446 + free(diff);
  1447 + free(blink);
  1448 + free(flink);
  1449 + return NULL;
1359 } 1450 }
1360 1451
1361 void jerasure_bitmatrix_encode(int k, int m, int w, int *bitmatrix, 1452 void jerasure_bitmatrix_encode(int k, int m, int w, int *bitmatrix,