chiark / gitweb /
regress: Fix a message about length return values
[adns.git] / regress / hplayback.c.m4
index 786b1e429a98f34a51248a5d6e3ec02c93395ffa..916f97daee2ff010dcecdd31a3b1a069a37184f5 100644 (file)
@@ -3,7 +3,8 @@ m4_dnl (part of complex test harness, not of the library)
 m4_dnl - playback routines
 
 m4_dnl  This file is part of adns, which is
-m4_dnl    Copyright (C) 1997-2000,2003,2006  Ian Jackson
+m4_dnl    Copyright (C) 1997-2000,2003,2006,2014-2016,2020  Ian Jackson
+m4_dnl    Copyright (C) 2014  Mark Wooding
 m4_dnl    Copyright (C) 1999-2000,2003,2006  Tony Finch
 m4_dnl    Copyright (C) 1991 Massachusetts Institute of Technology
 m4_dnl  (See the file INSTALL for full details.)
@@ -19,8 +20,7 @@ m4_dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 m4_dnl  GNU General Public License for more details.
 m4_dnl  
 m4_dnl  You should have received a copy of the GNU General Public License
-m4_dnl  along with this program; if not, write to the Free Software Foundation,
-m4_dnl  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+m4_dnl  along with this program; if not, write to the Free Software Foundation.
 
 m4_include(hmacros.i4)
 
@@ -37,6 +37,8 @@ m4_include(hmacros.i4)
 
 #include <unistd.h>
 #include <fcntl.h>
+#include <limits.h>
+
 
 #include "harness.h"
 
@@ -69,16 +71,14 @@ static void Pcheckinput(void) {
 }
 
 void Tensurerecordfile(void) {
-  const char *fdstr;
   int fd;
   int chars;
   unsigned long sec, usec;
 
   if (Tinputfile) return;
   Tinputfile= stdin;
-  fdstr= getenv("ADNS_TEST_IN_FD");
-  if (fdstr) {
-    fd= atoi(fdstr);
+  fd = Ttestinputfd();
+  if (fd >= 0) {
     Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD");
   }
   setvbuf(Tinputfile,0,_IONBF,0);
@@ -126,6 +126,7 @@ static int Perrno(const char *stuff) {
   if (te->n) return te->v;
   r= strtoul(stuff+2,&ep,10);
   if (*ep) Psyntax("errno value not recognised, not numeric");
+  if (r==0 || r>255) Psyntax("numeric errno out of range 1..255");
   return r;
 }
 
@@ -148,17 +149,23 @@ static void P_updatetime(void) {
 }
 
 static void Pfdset(fd_set *set, int max) {
-  int r, c;
+  int c;
+  unsigned long ul;
   char *ep;
+
+  if (!set) {
+    Pstring("null","null fdset pointer");
+    return;
+  }
   
   if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("fd set start not [");
   FD_ZERO(set);
   if (vb2.buf[vb2.used] == hm_squote]hm_squote) { vb2.used++; return; }
   for (;;) {
-    r= strtoul(vb2.buf+vb2.used,&ep,10);
-    if (r>=max) Psyntax("fd set member > max");
+    ul= strtoul(vb2.buf+vb2.used,&ep,10);
+    if (ul>=max) Psyntax("fd set member > max");
     if (ep == (char*)vb2.buf+vb2.used) Psyntax("empty entry in fd set");
-    FD_SET(r,set);
+    FD_SET(ul,set);
     vb2.used= ep - (char*)vb2.buf;
     c= vb2.buf[vb2.used++];
     if (c == hm_squote]hm_squote) break;
@@ -343,8 +350,11 @@ int H$1(hm_args_massage($3,void)) {
  m4_define(`hm_rv_len',`hm_rv_succfail')
  m4_define(`hm_rv_must',`hm_rv_succfail')
  m4_define(`hm_rv_any',`
-  r= strtoul(vb2.buf+hm_r_offset,&ep,10);
-  if (*ep && *ep!=hm_squote hm_squote) Psyntax("return value not E* or positive number");
+  unsigned long ul_r= strtoul(vb2.buf+hm_r_offset,&ep,10);
+  if (ul_r < 0 || ul_r > INT_MAX ||
+      (*ep && *ep!=hm_squote hm_squote))
+    Psyntax("return value not E* or positive number");
+  r= ul_r;
   vb2.used= ep - (char*)vb2.buf;
  ')
  m4_define(`hm_rv_fd',`hm_rv_any')