diff --git a/rcl_yaml_param_parser/src/parser.c b/rcl_yaml_param_parser/src/parser.c index 4dff023..48bc286 100644 --- a/rcl_yaml_param_parser/src/parser.c +++ b/rcl_yaml_param_parser/src/parser.c @@ -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; diff --git a/rcl_yaml_param_parser/test/max_num_params.yaml b/rcl_yaml_param_parser/test/max_num_params.yaml new file mode 100644 index 0000000..2e50c84 --- /dev/null +++ b/rcl_yaml_param_parser/test/max_num_params.yaml @@ -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 diff --git a/rcl_yaml_param_parser/test/test_parse_yaml.cpp b/rcl_yaml_param_parser/test/test_parse_yaml.cpp index 03934a3..339de5e 100644 --- a/rcl_yaml_param_parser/test/test_parse_yaml.cpp +++ b/rcl_yaml_param_parser/test/test_parse_yaml.cpp @@ -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);