diff mbox series

[04/44] wrapper: add function to compare strings with different NUL termination

Message ID 20200513005424.81369-5-sandals@crustytoothpaste.net (mailing list archive)
State New, archived
Headers show
Series SHA-256 part 2/3: protocol functionality | expand

Commit Message

brian m. carlson May 13, 2020, 12:53 a.m. UTC
When parsing capabilities for the pack protocol, there are times we'll
want to compare the value of a capability to a NUL-terminated string.
Since the data we're reading will be space-terminated, not
NUL-terminated, we need a function that compares the two strings, but
also checks that they're the same length.  Otherwise, if we used strncmp
to compare these strings, we might accidentally accept a parameter that
was a prefix of the expected value.

Add a function, xstrncmpz, that takes a NUL-terminated string and a
non-NUL-terminated string, plus a length, and compares them, ensuring
that they are the same length.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 git-compat-util.h |  2 ++
 wrapper.c         | 12 ++++++++++++
 2 files changed, 14 insertions(+)

Comments

Martin Ă…gren May 13, 2020, 7:32 p.m. UTC | #1
On Wed, 13 May 2020 at 02:56, brian m. carlson
<sandals@crustytoothpaste.net> wrote:
> diff --git a/git-compat-util.h b/git-compat-util.h
> index 8ba576e81e..6503deb171 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -868,6 +868,8 @@ char *xgetcwd(void);
>  FILE *fopen_for_writing(const char *path);
>  FILE *fopen_or_warn(const char *path, const char *mode);
>
> +int xstrncmpz(const char *s, const char *t, size_t len);
> +
>  /*
>   * FREE_AND_NULL(ptr) is like free(ptr) followed by ptr = NULL. Note
>   * that ptr is used twice, so don't pass e.g. ptr++.
> diff --git a/wrapper.c b/wrapper.c
> index 3a1c0e0526..15a09740e7 100644
> --- a/wrapper.c
> +++ b/wrapper.c
> @@ -430,6 +430,18 @@ int xmkstemp(char *filename_template)
>         return fd;
>  }
>
> +/*
> + * Like strncmp, but only return zero if s is NUL-terminated and exactly len
> + * characters long.  If it is not, consider it greater than t.
> + */

I think this comment would be easier to find in the .h file.

And since I'm already commenting...

> +int xstrncmpz(const char *s, const char *t, size_t len)
> +{
> +       int res = strncmp(s, t, len);
> +       if (res)
> +               return res;
> +       return s[len] == '\0' ? 0 : 1;
> +}
> +
>  /* Adapted from libiberty's mkstemp.c. */
>
>  #undef TMP_MAX

It's not entirely obvious from the context, but this function is
inserted between some "tmp" stuff and some other "tmp" stuff. I don't
think we need to bikeshed its exact home, but maybe "close to other
string stuff", or at least not in the middle of the "tmp" section.


Martin
diff mbox series

Patch

diff --git a/git-compat-util.h b/git-compat-util.h
index 8ba576e81e..6503deb171 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -868,6 +868,8 @@  char *xgetcwd(void);
 FILE *fopen_for_writing(const char *path);
 FILE *fopen_or_warn(const char *path, const char *mode);
 
+int xstrncmpz(const char *s, const char *t, size_t len);
+
 /*
  * FREE_AND_NULL(ptr) is like free(ptr) followed by ptr = NULL. Note
  * that ptr is used twice, so don't pass e.g. ptr++.
diff --git a/wrapper.c b/wrapper.c
index 3a1c0e0526..15a09740e7 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -430,6 +430,18 @@  int xmkstemp(char *filename_template)
 	return fd;
 }
 
+/*
+ * Like strncmp, but only return zero if s is NUL-terminated and exactly len
+ * characters long.  If it is not, consider it greater than t.
+ */
+int xstrncmpz(const char *s, const char *t, size_t len)
+{
+	int res = strncmp(s, t, len);
+	if (res)
+		return res;
+	return s[len] == '\0' ? 0 : 1;
+}
+
 /* Adapted from libiberty's mkstemp.c. */
 
 #undef TMP_MAX