Message ID | 20210610143800.3293854-1-konstantin@daynix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qga-win: Free GMatchInfo properly | expand |
Hi On Thu, Jun 10, 2021 at 6:38 PM Kostiantyn Kostiuk <konstantin@daynix.com> wrote: > The g_regex_match function creates match_info even if it > returns FALSE. So we should always call g_match_info_free. > > Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com> > --- > qga/commands-win32.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/qga/commands-win32.c b/qga/commands-win32.c > index 300b87c859..e8bc3df306 100644 > --- a/qga/commands-win32.c > +++ b/qga/commands-win32.c > @@ -2497,6 +2497,7 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error > **errp) > GMatchInfo *match_info; > What about using g_autoptr instead? GuestDeviceIdPCI *id; > if (!g_regex_match(device_pci_re, hw_ids[j], 0, &match_info)) > { > + g_match_info_free(match_info); > continue; > } > skip = false; > -- > 2.25.1 > > >
Hi All, For freeing GMatchInfo struct, a special function is required. I'm not sure is it possible to use g_autoptr in this case or no. In GLib example https://developer.gnome.org/glib/stable/glib-Perl-compatible-regular-expressions.html#g-regex-match, g_match_info_free is used directly. Best wishes, Kostiantyn Kostiuk On Thu, Jun 10, 2021 at 5:41 PM Marc-André Lureau < marcandre.lureau@gmail.com> wrote: > Hi > > On Thu, Jun 10, 2021 at 6:38 PM Kostiantyn Kostiuk <konstantin@daynix.com> > wrote: > >> The g_regex_match function creates match_info even if it >> returns FALSE. So we should always call g_match_info_free. >> >> Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com> >> --- >> qga/commands-win32.c | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/qga/commands-win32.c b/qga/commands-win32.c >> index 300b87c859..e8bc3df306 100644 >> --- a/qga/commands-win32.c >> +++ b/qga/commands-win32.c >> @@ -2497,6 +2497,7 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error >> **errp) >> GMatchInfo *match_info; >> > > What about using g_autoptr instead? > > GuestDeviceIdPCI *id; >> if (!g_regex_match(device_pci_re, hw_ids[j], 0, >> &match_info)) { >> + g_match_info_free(match_info); >> continue; >> } >> skip = false; >> -- >> 2.25.1 >> >> >> > > -- > Marc-André Lureau >
On Thu, Jun 10, 2021 at 05:53:35PM +0300, Konstantin Kostiuk wrote: > Hi All, > > For freeing GMatchInfo struct, a special function is required. I'm not sure is > it possible to use g_autoptr in this case or no. > In GLib example > https://developer.gnome.org/glib/stable/glib-Perl-compatible-regular-expressions.html#g-regex-match, > g_match_info_free is used directly. That is fine - g_autoptr calls the required deallocation function that was previously registered. This is different from g_autofree which merely calls g_free. We can see GMatchInfo is configured to call g_match_info_free: $ grep GMatchIn /usr/include/glib-2.0/glib/*.h /usr/include/glib-2.0/glib/glib-autocleanups.h:G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMatchInfo, g_match_info_unref) Regards, Daniel
Thanks, Daniel! A new patch was sent. Best wishes, Kostiantyn Kostiuk On Thu, Jun 10, 2021 at 6:23 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > On Thu, Jun 10, 2021 at 05:53:35PM +0300, Konstantin Kostiuk wrote: > > Hi All, > > > > For freeing GMatchInfo struct, a special function is required. I'm not > sure is > > it possible to use g_autoptr in this case or no. > > In GLib example > > > https://developer.gnome.org/glib/stable/glib-Perl-compatible-regular-expressions.html#g-regex-match > , > > g_match_info_free is used directly. > > That is fine - g_autoptr calls the required deallocation function > that was previously registered. This is different from g_autofree > which merely calls g_free. > > We can see GMatchInfo is configured to call g_match_info_free: > > $ grep GMatchIn /usr/include/glib-2.0/glib/*.h > /usr/include/glib-2.0/glib/glib-autocleanups.h:G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMatchInfo, > g_match_info_unref) > > > Regards, > Daniel > -- > |: https://berrange.com -o- > https://www.flickr.com/photos/dberrange :| > |: https://libvirt.org -o- > https://fstop138.berrange.com :| > |: https://entangle-photo.org -o- > https://www.instagram.com/dberrange :| > >
diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 300b87c859..e8bc3df306 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -2497,6 +2497,7 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error **errp) GMatchInfo *match_info; GuestDeviceIdPCI *id; if (!g_regex_match(device_pci_re, hw_ids[j], 0, &match_info)) { + g_match_info_free(match_info); continue; } skip = false;
The g_regex_match function creates match_info even if it returns FALSE. So we should always call g_match_info_free. Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com> --- qga/commands-win32.c | 1 + 1 file changed, 1 insertion(+)