This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit cfe067f618c39de132e5ed560d98f29ebfb639cb Author: Mihai Moldovan <ionic@ionic.de> Date: Sat Apr 24 09:12:05 2021 +0200 src/x2goclient-openssh-version.{c,h}: correctly check for the validity of version components. The previous code took a shortcut and checked if the component was positive or zero, but since the backing type is unsigned, this was a tautology. Instead, rework this portion to use bit flags indicating whether each component is valid or not, initialize them correctly (to the invalid state) and only set them to valid if a valid value has been provided. --- src/x2goclient-openssh-version.c | 69 ++++++++++++++++++++++++++-------------- src/x2goclient-openssh-version.h | 3 ++ 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/x2goclient-openssh-version.c b/src/x2goclient-openssh-version.c index 109184a..b2dcf0f 100644 --- a/src/x2goclient-openssh-version.c +++ b/src/x2goclient-openssh-version.c @@ -84,37 +84,59 @@ G_DEFINE_BOXED_TYPE (X2GoClientOpenSSHVersion, x2goclient_openssh_version, &x2go out_var = GENERATE_ERROR (PATCH, error);\ }\ } while (0) -#define SET_VER_COMPONENT(out_struct, idx_var, value) \ + +#define SET_VER_COMPONENT(ver_struct, idx_var, value, init) \ do {\ - if (0 == idx_var) {\ - out_struct->major = value;\ + _Bool valid = TRUE;\ + if ((init)) {\ + valid = FALSE;\ }\ - else if (1 == idx_var) {\ - out_struct->minor = value;\ + if (0 == (idx_var)) {\ + if ((init)) {\ + (ver_struct)->major = 0;\ + }\ + else {\ + (ver_struct)->major = (value);\ + }\ + (ver_struct)->major_valid = valid;\ + }\ + else if (1 == (idx_var)) {\ + if ((init)) {\ + (ver_struct)->minor = 0;\ + }\ + else {\ + (ver_struct)->minor = (value);\ + }\ + (ver_struct)->minor_valid = valid;\ }\ else {\ - out_struct->patch = value;\ + if ((init)) {\ + (ver_struct)->patch = 0;\ + }\ + else {\ + (ver_struct)->patch = (value);\ + }\ + (ver_struct)->patch_valid = valid;\ }\ } while (0) -#define CHECK_VER_COMPONENT(out_struct, idx_var, err) \ + +#define INIT_VER_COMPONENT(ver_struct, idx_var) SET_VER_COMPONENT ((ver_struct), (idx_var), (guint32)(0), TRUE) + +#define CHECK_VER_COMPONENT(ver_struct, idx_var, err) \ do {\ - if (0 == idx_var) {\ - if (0 > out_struct->major) {\ - err = TRUE;\ - break;\ - }\ + _Bool new_err = (err);\ + if (0 == (idx_var)) {\ + new_err = (!((ver_struct)->major_valid));\ }\ - else if (1 == idx_var) {\ - if (0 > out_struct->minor) {\ - err = TRUE;\ - break;\ - }\ + else if (1 == (idx_var)) {\ + new_err = (!((ver_struct)->minor_valid));\ }\ else {\ - if (0 > out_struct->patch) {\ - err = TRUE;\ - break;\ - }\ + new_err = (!((ver_struct)->patch_valid));\ + }\ + if (new_err) {\ + (err) = TRUE;\ + break;\ }\ } while (0) @@ -264,7 +286,7 @@ _Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion * const openssh /* Copy and convert version number. */ gchar *tmp_copy = g_strndup (tmp, (end_search - tmp)); - SET_VER_COMPONENT (struct_work_copy, num_i, -1); + INIT_VER_COMPONENT (struct_work_copy, num_i); _Bool conv_err = TRUE, min_err = TRUE, @@ -306,7 +328,8 @@ _Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion * const openssh g_set_error_literal (gerr, ERROR_QUARK, err_code, err_msg); } else { - SET_VER_COMPONENT (struct_work_copy, num_i, conv); + /* The cast here is safe since we already checked bounds. */ + SET_VER_COMPONENT (struct_work_copy, num_i, (guint32)(conv), FALSE); } } diff --git a/src/x2goclient-openssh-version.h b/src/x2goclient-openssh-version.h index 9e21cf2..1b07d40 100644 --- a/src/x2goclient-openssh-version.h +++ b/src/x2goclient-openssh-version.h @@ -32,6 +32,9 @@ G_BEGIN_DECLS typedef struct X2GoClientOpenSSHVersion_ { + int minor_valid:1; + int major_valid:1; + int patch_valid:1; guint32 major; guint32 minor; guint32 patch; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git