[PATCH] vsh: Allow vshReadlineInit() to be called multiple times

Michal Privoznik posted 1 patch 3 months, 2 weeks ago
tools/vsh.c | 3 +++
1 file changed, 3 insertions(+)
[PATCH] vsh: Allow vshReadlineInit() to be called multiple times
Posted by Michal Privoznik 3 months, 2 weeks ago
Thing about vshReadlineInit() is - it's called multiple times.
The first time from vshInit(), when @ctl was filled only
partially (most notably, before any argv parsing is done, hence
ctl->imode is set to false). The second time after argv parsing,
from virshInit() -> vshInitReload(). In here, ctl->imode might
have changed and thus vshReadlineInit() can't exit early - it
needs to set up stuff for interactive mode (history basically).

To allow vshReadlineInit() to be called again,
vshReadlineDeinit() must set @autoCompleteOpaque to NULL.

Fixes: cab1e71f0161fd24c5d6ff4c379d3a242ea8c2d9
Resolves: https://issues.redhat.com/browse/RHEL-53560
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 tools/vsh.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tools/vsh.c b/tools/vsh.c
index 9fbb1f9349..5f5e2f281d 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -3040,6 +3040,9 @@ vshReadlineDeinit(vshControl *ctl)
 
     g_clear_pointer(&ctl->historydir, g_free);
     g_clear_pointer(&ctl->historyfile, g_free);
+
+    /* Allow vshReadlineInit() to be called again. */
+    autoCompleteOpaque = NULL;
 }
 
 char *
-- 
2.44.2
Re: [PATCH] vsh: Allow vshReadlineInit() to be called multiple times
Posted by Jiri Denemark 3 months, 2 weeks ago
On Thu, Aug 08, 2024 at 14:49:12 +0200, Michal Privoznik wrote:
> Thing about vshReadlineInit() is - it's called multiple times.
> The first time from vshInit(), when @ctl was filled only
> partially (most notably, before any argv parsing is done, hence
> ctl->imode is set to false). The second time after argv parsing,
> from virshInit() -> vshInitReload(). In here, ctl->imode might
> have changed and thus vshReadlineInit() can't exit early - it
> needs to set up stuff for interactive mode (history basically).
> 
> To allow vshReadlineInit() to be called again,
> vshReadlineDeinit() must set @autoCompleteOpaque to NULL.
> 
> Fixes: cab1e71f0161fd24c5d6ff4c379d3a242ea8c2d9
> Resolves: https://issues.redhat.com/browse/RHEL-53560
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  tools/vsh.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/tools/vsh.c b/tools/vsh.c
> index 9fbb1f9349..5f5e2f281d 100644
> --- a/tools/vsh.c
> +++ b/tools/vsh.c
> @@ -3040,6 +3040,9 @@ vshReadlineDeinit(vshControl *ctl)
>  
>      g_clear_pointer(&ctl->historydir, g_free);
>      g_clear_pointer(&ctl->historyfile, g_free);
> +
> +    /* Allow vshReadlineInit() to be called again. */
> +    autoCompleteOpaque = NULL;
>  }
>  
>  char *

Reviewed-by: Jiri Denemark <jdenemar@redhat.com>