Fix memory corruption when maximum number of parameters is exceeded (#456)

If the maximum number is exceeded fail with an informative error message.

Fixes #419.

Signed-off-by: Jacob Perron <jacob@openrobotics.org>
This commit is contained in:
Jacob Perron 2019-06-07 14:56:05 -07:00 committed by GitHub
parent 79b3ec1052
commit ec8539b65c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 546 additions and 0 deletions

View file

@ -1129,6 +1129,15 @@ static rcl_ret_t parse_key(
}
*is_new_map = false;
}
// Guard against adding more than the maximum allowed parameters
if (params_st->params[node_idx].num_params >= MAX_NUM_PARAMS_PER_NODE) {
RCL_SET_ERROR_MSG_WITH_FORMAT_STRING(
"Exceeded maximum allowed number of parameters for a node (%d)",
MAX_NUM_PARAMS_PER_NODE);
return RCL_RET_ERROR;
}
/// Add a parameter name into the node parameters
parameter_idx = params_st->params[node_idx].num_params;
parameter_ns = ns_tracker->parameter_ns;

View file

@ -0,0 +1,519 @@
# config/test_yaml
---
foo_ns:
foo_name:
ros__parameters:
param1: 1
param2: 2
param3: 3
param4: 4
param5: 5
param6: 6
param7: 7
param8: 8
param9: 9
param10: 10
param11: 11
param12: 12
param13: 13
param14: 14
param15: 15
param16: 16
param17: 17
param18: 18
param19: 19
param20: 20
param21: 21
param22: 22
param23: 23
param24: 24
param25: 25
param26: 26
param27: 27
param28: 28
param29: 29
param30: 30
param31: 31
param32: 32
param33: 33
param34: 34
param35: 35
param36: 36
param37: 37
param38: 38
param39: 39
param40: 40
param41: 41
param42: 42
param43: 43
param44: 44
param45: 45
param46: 46
param47: 47
param48: 48
param49: 49
param50: 50
param51: 51
param52: 52
param53: 53
param54: 54
param55: 55
param56: 56
param57: 57
param58: 58
param59: 59
param60: 60
param61: 61
param62: 62
param63: 63
param64: 64
param65: 65
param66: 66
param67: 67
param68: 68
param69: 69
param70: 70
param71: 71
param72: 72
param73: 73
param74: 74
param75: 75
param76: 76
param77: 77
param78: 78
param79: 79
param80: 80
param81: 81
param82: 82
param83: 83
param84: 84
param85: 85
param86: 86
param87: 87
param88: 88
param89: 89
param90: 90
param91: 91
param92: 92
param93: 93
param94: 94
param95: 95
param96: 96
param97: 97
param98: 98
param99: 99
param100: 100
param101: 101
param102: 102
param103: 103
param104: 104
param105: 105
param106: 106
param107: 107
param108: 108
param109: 109
param110: 110
param111: 111
param112: 112
param113: 113
param114: 114
param115: 115
param116: 116
param117: 117
param118: 118
param119: 119
param120: 120
param121: 121
param122: 122
param123: 123
param124: 124
param125: 125
param126: 126
param127: 127
param128: 128
param129: 129
param130: 130
param131: 131
param132: 132
param133: 133
param134: 134
param135: 135
param136: 136
param137: 137
param138: 138
param139: 139
param140: 140
param141: 141
param142: 142
param143: 143
param144: 144
param145: 145
param146: 146
param147: 147
param148: 148
param149: 149
param150: 150
param151: 151
param152: 152
param153: 153
param154: 154
param155: 155
param156: 156
param157: 157
param158: 158
param159: 159
param160: 160
param161: 161
param162: 162
param163: 163
param164: 164
param165: 165
param166: 166
param167: 167
param168: 168
param169: 169
param170: 170
param171: 171
param172: 172
param173: 173
param174: 174
param175: 175
param176: 176
param177: 177
param178: 178
param179: 179
param180: 180
param181: 181
param182: 182
param183: 183
param184: 184
param185: 185
param186: 186
param187: 187
param188: 188
param189: 189
param190: 190
param191: 191
param192: 192
param193: 193
param194: 194
param195: 195
param196: 196
param197: 197
param198: 198
param199: 199
param200: 200
param201: 201
param202: 202
param203: 203
param204: 204
param205: 205
param206: 206
param207: 207
param208: 208
param209: 209
param210: 210
param211: 211
param212: 212
param213: 213
param214: 214
param215: 215
param216: 216
param217: 217
param218: 218
param219: 219
param220: 220
param221: 221
param222: 222
param223: 223
param224: 224
param225: 225
param226: 226
param227: 227
param228: 228
param229: 229
param230: 230
param231: 231
param232: 232
param233: 233
param234: 234
param235: 235
param236: 236
param237: 237
param238: 238
param239: 239
param240: 240
param241: 241
param242: 242
param243: 243
param244: 244
param245: 245
param246: 246
param247: 247
param248: 248
param249: 249
param250: 250
param251: 251
param252: 252
param253: 253
param254: 254
param255: 255
param256: 256
param257: 257
param258: 258
param259: 259
param260: 260
param261: 261
param262: 262
param263: 263
param264: 264
param265: 265
param266: 266
param267: 267
param268: 268
param269: 269
param270: 270
param271: 271
param272: 272
param273: 273
param274: 274
param275: 275
param276: 276
param277: 277
param278: 278
param279: 279
param280: 280
param281: 281
param282: 282
param283: 283
param284: 284
param285: 285
param286: 286
param287: 287
param288: 288
param289: 289
param290: 290
param291: 291
param292: 292
param293: 293
param294: 294
param295: 295
param296: 296
param297: 297
param298: 298
param299: 299
param300: 300
param301: 301
param302: 302
param303: 303
param304: 304
param305: 305
param306: 306
param307: 307
param308: 308
param309: 309
param310: 310
param311: 311
param312: 312
param313: 313
param314: 314
param315: 315
param316: 316
param317: 317
param318: 318
param319: 319
param320: 320
param321: 321
param322: 322
param323: 323
param324: 324
param325: 325
param326: 326
param327: 327
param328: 328
param329: 329
param330: 330
param331: 331
param332: 332
param333: 333
param334: 334
param335: 335
param336: 336
param337: 337
param338: 338
param339: 339
param340: 340
param341: 341
param342: 342
param343: 343
param344: 344
param345: 345
param346: 346
param347: 347
param348: 348
param349: 349
param350: 350
param351: 351
param352: 352
param353: 353
param354: 354
param355: 355
param356: 356
param357: 357
param358: 358
param359: 359
param360: 360
param361: 361
param362: 362
param363: 363
param364: 364
param365: 365
param366: 366
param367: 367
param368: 368
param369: 369
param370: 370
param371: 371
param372: 372
param373: 373
param374: 374
param375: 375
param376: 376
param377: 377
param378: 378
param379: 379
param380: 380
param381: 381
param382: 382
param383: 383
param384: 384
param385: 385
param386: 386
param387: 387
param388: 388
param389: 389
param390: 390
param391: 391
param392: 392
param393: 393
param394: 394
param395: 395
param396: 396
param397: 397
param398: 398
param399: 399
param400: 400
param401: 401
param402: 402
param403: 403
param404: 404
param405: 405
param406: 406
param407: 407
param408: 408
param409: 409
param410: 410
param411: 411
param412: 412
param413: 413
param414: 414
param415: 415
param416: 416
param417: 417
param418: 418
param419: 419
param420: 420
param421: 421
param422: 422
param423: 423
param424: 424
param425: 425
param426: 426
param427: 427
param428: 428
param429: 429
param430: 430
param431: 431
param432: 432
param433: 433
param434: 434
param435: 435
param436: 436
param437: 437
param438: 438
param439: 439
param440: 440
param441: 441
param442: 442
param443: 443
param444: 444
param445: 445
param446: 446
param447: 447
param448: 448
param449: 449
param450: 450
param451: 451
param452: 452
param453: 453
param454: 454
param455: 455
param456: 456
param457: 457
param458: 458
param459: 459
param460: 460
param461: 461
param462: 462
param463: 463
param464: 464
param465: 465
param466: 466
param467: 467
param468: 468
param469: 469
param470: 470
param471: 471
param472: 472
param473: 473
param474: 474
param475: 475
param476: 476
param477: 477
param478: 478
param479: 479
param480: 480
param481: 481
param482: 482
param483: 483
param484: 484
param485: 485
param486: 486
param487: 487
param488: 488
param489: 489
param490: 490
param491: 491
param492: 492
param493: 493
param494: 494
param495: 495
param496: 496
param497: 497
param498: 498
param499: 499
param500: 500
param501: 501
param502: 502
param503: 503
param504: 504
param505: 505
param506: 506
param507: 507
param508: 508
param509: 509
param510: 510
param511: 511
param512: 512
param513: 513

View file

@ -225,6 +225,24 @@ TEST(test_file_parser, indented_ns) {
allocator.deallocate(path, allocator.state);
}
// Regression test for https://github.com/ros2/rcl/issues/419
TEST(test_file_parser, maximum_number_parameters) {
rcutils_reset_error();
EXPECT_TRUE(rcutils_get_cwd(cur_dir, 1024));
rcutils_allocator_t allocator = rcutils_get_default_allocator();
char * test_path = rcutils_join_path(cur_dir, "test", allocator);
char * path = rcutils_join_path(test_path, "max_num_params.yaml", allocator);
fprintf(stderr, "cur_path: %s\n", path);
EXPECT_TRUE(rcutils_exists(path));
rcl_params_t * params_hdl = rcl_yaml_node_struct_init(allocator);
EXPECT_FALSE(NULL == params_hdl);
bool res = rcl_parse_yaml_file(path, params_hdl);
fprintf(stderr, "%s\n", rcutils_get_error_string().str);
EXPECT_FALSE(res);
allocator.deallocate(test_path, allocator.state);
allocator.deallocate(path, allocator.state);
}
int32_t main(int32_t argc, char ** argv)
{
::testing::InitGoogleTest(&argc, argv);