path: root/src/wordsplit.c
authorSergey Poznyakoff <>2019-06-05 13:34:43 (GMT)
committer Sergey Poznyakoff <>2019-06-05 13:34:43 (GMT)
commitb9e95e79712c1e0021e63204e0d910da2ec2692a (patch) (side-by-side diff)
treed4d70a225257807223d944972cd3a25b9bb055a4 /src/wordsplit.c
parent1fa2dd2c6587822ff682581643499c3c3b78c9ea (diff)
wordsplit: special handling for WRDSE_USAGE.
* src/wordsplit.c (wordsplit_run): Initialize ws_errctx early. This ensures that wordsplit_strerror gets correct data after WRDSE_USAGE. (wordsplit_free): Return immediately if errno was WRDSE_USAGE.
Diffstat (limited to 'src/wordsplit.c') (more/less context) (ignore whitespace changes)
1 files changed, 6 insertions, 0 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c
index 48312bb..b38dde4 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -2683,12 +2683,14 @@ static int
wordsplit_run (const char *command, size_t length, struct wordsplit *wsp,
int flags, int lvl)
int rc;
size_t start;
+ /* Initialize error context early */
+ wsp->ws_errctx = NULL;
if (!command)
if (!(flags & WRDSF_INCREMENTAL))
return _wsplt_seterr (wsp, WRDSE_USAGE);
if (wsp->ws_head)
@@ -2793,12 +2795,16 @@ wordsplit_clearerr (struct wordsplit *ws)
ws->ws_errno = WRDSE_OK;
wordsplit_free (struct wordsplit *ws)
+ if (ws->ws_errno == WRDSE_USAGE)
+ /* Usage error: the structure is not properly initialized and there's
+ nothing to free. */
+ return;
wordsplit_clearerr (ws);
wordsplit_free_nodes (ws);
wordsplit_free_words (ws);
free (ws->ws_wordv);
ws->ws_wordv = NULL;
wordsplit_free_envbuf (ws);

Return to:

Send suggestions and report system problems to the System administrator.