]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
strlen+malloc+snprintf is error prone;
[mandoc.git] / mdoc_validate.c
index 85ae65df37036c3c59a891fcaa5d0843560c5c7e..55573fa8c9f9a1384f9796cded1f671b17a1df49 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.210 2014/04/20 16:46:05 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.212 2014/04/20 20:48:53 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -45,8 +45,6 @@
 #define        PRE_ARGS  struct mdoc *mdoc, struct mdoc_node *n
 #define        POST_ARGS struct mdoc *mdoc
 
-#define        NUMSIZ    32
-
 enum   check_ineq {
        CHECK_LT,
        CHECK_GT,
@@ -1046,34 +1044,25 @@ post_bf(POST_ARGS)
 static int
 post_lb(POST_ARGS)
 {
-       const char      *p;
-       char            *buf;
-       size_t           sz;
+       struct mdoc_node        *n;
+       const char              *stdlibname;
+       char                    *libname;
 
        check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1);
 
-       assert(mdoc->last->child);
-       assert(MDOC_TEXT == mdoc->last->child->type);
-
-       p = mdoc_a2lib(mdoc->last->child->string);
-
-       /* If lookup ok, replace with table value. */
+       n = mdoc->last->child;
 
-       if (p) {
-               free(mdoc->last->child->string);
-               mdoc->last->child->string = mandoc_strdup(p);
-               return(1);
-       }
+       assert(n);
+       assert(MDOC_TEXT == n->type);
 
-       /* If not, use "library ``xxxx''. */
+       if (NULL == (stdlibname = mdoc_a2lib(n->string)))
+               mandoc_asprintf(&libname,
+                   "library \\(lq%s\\(rq", n->string);
+       else
+               libname = mandoc_strdup(stdlibname);
 
-       sz = strlen(mdoc->last->child->string) + 2 +
-            strlen("\\(lqlibrary\\(rq");
-       buf = mandoc_malloc(sz);
-       snprintf(buf, sz, "library \\(lq%s\\(rq",
-           mdoc->last->child->string);
-       free(mdoc->last->child->string);
-       mdoc->last->child->string = buf;
+       free(n->string);
+       n->string = libname;
        return(1);
 }
 
@@ -1388,7 +1377,7 @@ post_bl_block_width(POST_ARGS)
        int               i;
        enum mdoct        tok;
        struct mdoc_node *n;
-       char              buf[NUMSIZ];
+       char              buf[24];
 
        n = mdoc->last;
 
@@ -1420,7 +1409,7 @@ post_bl_block_width(POST_ARGS)
 
        assert(i < (int)n->args->argc);
 
-       snprintf(buf, NUMSIZ, "%un", (unsigned int)width);
+       (void)snprintf(buf, sizeof(buf), "%un", (unsigned int)width);
        free(n->args->argv[i].value[0]);
        n->args->argv[i].value[0] = mandoc_strdup(buf);
 
@@ -1435,7 +1424,7 @@ post_bl_block_tag(POST_ARGS)
        struct mdoc_node *n, *nn;
        size_t            sz, ssz;
        int               i;
-       char              buf[NUMSIZ];
+       char              buf[24];
 
        /*
         * Calculate the -width for a `Bl -tag' list if it hasn't been
@@ -1470,7 +1459,7 @@ post_bl_block_tag(POST_ARGS)
 
        /* Defaults to ten ens. */
 
-       snprintf(buf, NUMSIZ, "%un", (unsigned int)sz);
+       (void)snprintf(buf, sizeof(buf), "%un", (unsigned int)sz);
 
        /*
         * We have to dynamically add this to the macro's argument list.