upstream commit
apparently memcpy(x, NULL, 0) is undefined behaviour
according to C99 (cf. sections 7.21.1 and 7.1.4), so check skip memcpy calls
when length==0; ok markus@
diff --git a/sshbuf-getput-basic.c b/sshbuf-getput-basic.c
index 682b68d..06d6cc4 100644
--- a/sshbuf-getput-basic.c
+++ b/sshbuf-getput-basic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf-getput-basic.c,v 1.2 2014/12/04 01:49:59 djm Exp $ */
+/* $OpenBSD: sshbuf-getput-basic.c,v 1.3 2015/01/12 15:18:07 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -34,7 +34,7 @@
if ((r = sshbuf_consume(buf, len)) < 0)
return r;
- if (v != NULL)
+ if (v != NULL && len != 0)
memcpy(v, p, len);
return 0;
}
@@ -109,7 +109,8 @@
SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL"));
return SSH_ERR_ALLOC_FAIL;
}
- memcpy(*valp, val, len);
+ if (len != 0)
+ memcpy(*valp, val, len);
(*valp)[len] = '\0';
}
if (lenp != NULL)
@@ -200,7 +201,8 @@
SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL"));
return SSH_ERR_ALLOC_FAIL;
}
- memcpy(*valp, p, len);
+ if (len != 0)
+ memcpy(*valp, p, len);
(*valp)[len] = '\0';
}
if (lenp != NULL)
@@ -236,7 +238,8 @@
if ((r = sshbuf_reserve(buf, len, &p)) < 0)
return r;
- memcpy(p, v, len);
+ if (len != 0)
+ memcpy(p, v, len);
return 0;
}
@@ -352,7 +355,8 @@
if ((r = sshbuf_reserve(buf, len + 4, &d)) < 0)
return r;
POKE_U32(d, len);
- memcpy(d + 4, v, len);
+ if (len != 0)
+ memcpy(d + 4, v, len);
return 0;
}
@@ -416,6 +420,7 @@
POKE_U32(d, len + prepend);
if (prepend)
d[4] = 0;
- memcpy(d + 4 + prepend, s, len);
+ if (len != 0)
+ memcpy(d + 4 + prepend, s, len);
return 0;
}