0130-kern-parser-Refactor-grub_parser_split_cmdline-clean.patch 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. From 8bc817014ce3d7a498db44eae33c8b90e2430926 Mon Sep 17 00:00:00 2001
  2. From: Chris Coulson <chris.coulson@canonical.com>
  3. Date: Wed, 6 Jan 2021 13:54:26 +0000
  4. Subject: [PATCH] kern/parser: Refactor grub_parser_split_cmdline() cleanup
  5. Introduce a common function epilogue used for cleaning up on all
  6. return paths, which will simplify additional error handling to be
  7. introduced in a subsequent commit.
  8. Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
  9. Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
  10. Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
  11. ---
  12. grub-core/kern/parser.c | 35 ++++++++++++++++++++---------------
  13. 1 file changed, 20 insertions(+), 15 deletions(-)
  14. diff --git a/grub-core/kern/parser.c b/grub-core/kern/parser.c
  15. index 572c670..e010eaa 100644
  16. --- a/grub-core/kern/parser.c
  17. +++ b/grub-core/kern/parser.c
  18. @@ -221,19 +221,13 @@ grub_parser_split_cmdline (const char *cmdline,
  19. if (process_char (*rp, buffer, &bp, varname, &vp, state, argc,
  20. &newstate) != GRUB_ERR_NONE)
  21. - {
  22. - if (rd != cmdline)
  23. - grub_free (rd);
  24. - return grub_errno;
  25. - }
  26. + goto fail;
  27. +
  28. state = newstate;
  29. }
  30. }
  31. while (state != GRUB_PARSER_STATE_TEXT && !check_varstate (state));
  32. - if (rd != cmdline)
  33. - grub_free (rd);
  34. -
  35. /* A special case for when the last character was part of a
  36. variable. */
  37. add_var (varname, &bp, &vp, state, GRUB_PARSER_STATE_TEXT);
  38. @@ -243,20 +237,20 @@ grub_parser_split_cmdline (const char *cmdline,
  39. /* If there are no args, then we're done. */
  40. if (!*argc)
  41. - return 0;
  42. + {
  43. + grub_errno = GRUB_ERR_NONE;
  44. + goto out;
  45. + }
  46. /* Reserve memory for the return values. */
  47. args = grub_malloc (bp - buffer);
  48. if (!args)
  49. - return grub_errno;
  50. + goto fail;
  51. grub_memcpy (args, buffer, bp - buffer);
  52. *argv = grub_calloc (*argc + 1, sizeof (char *));
  53. if (!*argv)
  54. - {
  55. - grub_free (args);
  56. - return grub_errno;
  57. - }
  58. + goto fail;
  59. /* The arguments are separated with 0's, setup argv so it points to
  60. the right values. */
  61. @@ -269,7 +263,18 @@ grub_parser_split_cmdline (const char *cmdline,
  62. bp++;
  63. }
  64. - return 0;
  65. + grub_errno = GRUB_ERR_NONE;
  66. +
  67. + out:
  68. + if (rd != cmdline)
  69. + grub_free (rd);
  70. +
  71. + return grub_errno;
  72. +
  73. + fail:
  74. + grub_free (*argv);
  75. + grub_free (args);
  76. + goto out;
  77. }
  78. /* Helper for grub_parser_execute. */
  79. --
  80. 2.14.2