[PATCH:libxkbfile 3/4] Convert sprintf calls to snprintf

walter harms wharms at bfs.de
Sun Oct 27 13:16:19 CET 2013



Am 26.10.2013 23:10, schrieb Alan Coopersmith:
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
> ---
>  src/cout.c     |    4 +-
>  src/maprules.c |    8 +-
>  src/xkbtext.c  |  230 ++++++++++++++++++++++++++++++--------------------------
>  3 files changed, 128 insertions(+), 114 deletions(-)
> 
> diff --git a/src/cout.c b/src/cout.c
> index 7e2c3cf..aa1b22d 100644
> --- a/src/cout.c
> +++ b/src/cout.c
> @@ -86,8 +86,8 @@ WriteCHdrKeycodes(FILE * file, XkbDescPtr xkb)
>                  XkbAtomText(xkb->dpy, kcName, XkbMessage));
>      fprintf(file, "static XkbKeyNameRec	keyNames[NUM_KEYS]= {\n");
>      for (i = 0; i <= xkb->max_key_code; i++) {
> -        sprintf(buf, "\"%s\"",
> -                XkbKeyNameText(xkb->names->keys[i].name, XkbCFile));
> +        snprintf(buf, sizeof(buf), "\"%s\"",
> +                 XkbKeyNameText(xkb->names->keys[i].name, XkbCFile));
>          if (i != xkb->max_key_code) {
>              fprintf(file, "    {  %6s  },", buf);
>              if ((i & 3) == 3)
> diff --git a/src/maprules.c b/src/maprules.c
> index f0c39b3..d42b105 100644
> --- a/src/maprules.c
> +++ b/src/maprules.c

If Xkb has asprint() it is possible to avoid all this strlen() stuff and use asprint().

just my 2 cents,
otherwise it looks ok.

re,
 wh

> @@ -1032,7 +1032,7 @@ XkbRF_LoadRulesByName(char *base, char *locale, XkbRF_RulesPtr rules)
>      if (locale) {
>          if (strlen(base) + strlen(locale) + 2 > PATH_MAX)
>              return False;
> -        sprintf(buf, "%s-%s", base, locale);
> +        snprintf(buf, sizeof(buf), "%s-%s", base, locale);
>      }
>      else {
>          if (strlen(base) + 1 > PATH_MAX)
> @@ -1237,17 +1237,17 @@ XkbRF_LoadDescriptionsByName(char *base, char *locale, XkbRF_RulesPtr rules)
>      if (locale) {
>          if (strlen(base) + strlen(locale) + 6 > PATH_MAX)
>              return False;
> -        sprintf(buf, "%s-%s.lst", base, locale);
> +        snprintf(buf, sizeof(buf), "%s-%s.lst", base, locale);
>      }
>      else {
>          if (strlen(base) + 5 > PATH_MAX)
>              return False;
> -        sprintf(buf, "%s.lst", base);
> +        snprintf(buf, sizeof(buf), "%s.lst", base);
>      }
>  
>      file = fopen(buf, "r");
>      if ((!file) && (locale)) {  /* fallback if locale was specified */
> -        sprintf(buf, "%s.lst", base);
> +        snprintf(buf, sizeof(buf), "%s.lst", base);
>  
>          file = fopen(buf, "r");
>      }
> diff --git a/src/xkbtext.c b/src/xkbtext.c
> index 76d3dbd..b5d4750 100644
> --- a/src/xkbtext.c
> +++ b/src/xkbtext.c
> @@ -152,11 +152,12 @@ XkbVModMaskText(Display *       dpy,
>      char *str, buf[BUFFER_SIZE];
>  
>      if ((modMask == 0) && (mask == 0)) {
> -        rtrn = tbGetBuffer(5);
> +        const int rtrnsize = 5;
> +        rtrn = tbGetBuffer(rtrnsize);
>          if (format == XkbCFile)
> -            sprintf(rtrn, "0");
> +            snprintf(rtrn, rtrnsize, "0");
>          else
> -            sprintf(rtrn, "none");
> +            snprintf(rtrn, rtrnsize, "none");
>          return rtrn;
>      }
>      if (modMask != 0)
> @@ -240,11 +241,11 @@ XkbModIndexText(unsigned ndx, unsigned format)
>  
>      if (format == XkbCFile) {
>          if (ndx < XkbNumModifiers)
> -            sprintf(buf, "%sMapIndex", modNames[ndx]);
> +            snprintf(buf, sizeof(buf), "%sMapIndex", modNames[ndx]);
>          else if (ndx == XkbNoModifier)
> -            sprintf(buf, "XkbNoModifier");
> +            snprintf(buf, sizeof(buf), "XkbNoModifier");
>          else
> -            sprintf(buf, "0x%02x", ndx);
> +            snprintf(buf, sizeof(buf), "0x%02x", ndx);
>      }
>      else {
>          if (ndx < XkbNumModifiers)
> @@ -252,7 +253,7 @@ XkbModIndexText(unsigned ndx, unsigned format)
>          else if (ndx == XkbNoModifier)
>              strcpy(buf, "none");
>          else
> -            sprintf(buf, "ILLEGAL_%02x", ndx);
> +            snprintf(buf, sizeof(buf), "ILLEGAL_%02x", ndx);
>      }
>      rtrn = tbGetBuffer(strlen(buf) + 1);
>      strcpy(rtrn, buf);
> @@ -310,8 +311,9 @@ char *
>  XkbConfigText(unsigned config, unsigned format)
>  {
>      static char *buf;
> +    const int bufsize = 32;
>  
> -    buf = tbGetBuffer(32);
> +    buf = tbGetBuffer(bufsize);
>      switch (config) {
>      case XkmSemanticsFile:
>          strcpy(buf, "Semantics");
> @@ -345,7 +347,7 @@ XkbConfigText(unsigned config, unsigned format)
>          strcpy(buf, "VirtualMods");
>          break;
>      default:
> -        sprintf(buf, "unknown(%d)", config);
> +        snprintf(buf, bufsize, "unknown(%d)", config);
>          break;
>      }
>      return buf;
> @@ -360,10 +362,12 @@ XkbKeysymText(KeySym sym, unsigned format)
>  
>      if (sym == NoSymbol)
>          strcpy(rtrn = buf, "NoSymbol");
> -    else if ((rtrn = XKeysymToString(sym)) == NULL)
> -        sprintf(rtrn = buf, "0x%lx", (long) sym);
> +    else if ((rtrn = XKeysymToString(sym)) == NULL) {
> +        snprintf(buf, sizeof(buf), "0x%lx", (long) sym);
> +        rtrn = buf;
> +    }
>      else if (format == XkbCFile) {
> -        sprintf(buf, "XK_%s", rtrn);
> +        snprintf(buf, sizeof(buf), "XK_%s", rtrn);
>          rtrn = buf;
>      }
>      return rtrn;
> @@ -413,14 +417,14 @@ XkbSIMatchText(unsigned type, unsigned format)
>      case XkbSI_AllOf:       rtrn = siMatchText[3]; break;
>      case XkbSI_Exactly:     rtrn = siMatchText[4]; break;
>      default:
> -        sprintf(buf, "0x%x", type & XkbSI_OpMask);
> +        snprintf(buf, sizeof(buf), "0x%x", type & XkbSI_OpMask);
>          return buf;
>      }
>      if (format == XkbCFile) {
>          if (type & XkbSI_LevelOneOnly)
> -            sprintf(buf, "XkbSI_LevelOneOnly|XkbSI_%s", rtrn);
> +            snprintf(buf, sizeof(buf), "XkbSI_LevelOneOnly|XkbSI_%s", rtrn);
>          else
> -            sprintf(buf, "XkbSI_%s", rtrn);
> +            snprintf(buf, sizeof(buf), "XkbSI_%s", rtrn);
>          rtrn = buf;
>      }
>      return rtrn;
> @@ -439,7 +443,7 @@ static const char *imWhichNames[] = {
>  char *
>  XkbIMWhichStateMaskText(unsigned use_which, unsigned format)
>  {
> -    int len;
> +    int len, bufsize;
>      unsigned i, bit, tmp;
>      char *buf;
>  
> @@ -457,7 +461,8 @@ XkbIMWhichStateMaskText(unsigned use_which, unsigned format)
>                  len += 9;
>          }
>      }
> -    buf = tbGetBuffer(len + 1);
> +    bufsize = len + 1;
> +    buf = tbGetBuffer(bufsize);
>      tmp = use_which & XkbIM_UseAnyMods;
>      for (len = i = 0, bit = 1; tmp != 0; i++, bit <<= 1) {
>          if (tmp & bit) {
> @@ -465,13 +470,15 @@ XkbIMWhichStateMaskText(unsigned use_which, unsigned format)
>              if (format == XkbCFile) {
>                  if (len != 0)
>                      buf[len++] = '|';
> -                sprintf(&buf[len], "XkbIM_Use%s", imWhichNames[i]);
> +                snprintf(&buf[len], bufsize - len,
> +                         "XkbIM_Use%s", imWhichNames[i]);
>                  buf[len + 9] = toupper(buf[len + 9]);
>              }
>              else {
>                  if (len != 0)
>                      buf[len++] = '+';
> -                sprintf(&buf[len], "%s", imWhichNames[i]);
> +                snprintf(&buf[len], bufsize - len,
> +                         "%s", imWhichNames[i]);
>              }
>              len += strlen(&buf[len]);
>          }
> @@ -484,36 +491,37 @@ XkbAccessXDetailText(unsigned state, unsigned format)
>  {
>      char *buf;
>      const char *prefix;
> +    const int bufsize = 32;
>  
> -    buf = tbGetBuffer(32);
> +    buf = tbGetBuffer(bufsize);
>      if (format == XkbMessage)
>          prefix = "";
>      else
>          prefix = "XkbAXN_";
>      switch (state) {
>      case XkbAXN_SKPress:
> -        sprintf(buf, "%sSKPress", prefix);
> +        snprintf(buf, bufsize, "%sSKPress", prefix);
>          break;
>      case XkbAXN_SKAccept:
> -        sprintf(buf, "%sSKAccept", prefix);
> +        snprintf(buf, bufsize, "%sSKAccept", prefix);
>          break;
>      case XkbAXN_SKRelease:
> -        sprintf(buf, "%sSKRelease", prefix);
> +        snprintf(buf, bufsize, "%sSKRelease", prefix);
>          break;
>      case XkbAXN_SKReject:
> -        sprintf(buf, "%sSKReject", prefix);
> +        snprintf(buf, bufsize, "%sSKReject", prefix);
>          break;
>      case XkbAXN_BKAccept:
> -        sprintf(buf, "%sBKAccept", prefix);
> +        snprintf(buf, bufsize, "%sBKAccept", prefix);
>          break;
>      case XkbAXN_BKReject:
> -        sprintf(buf, "%sBKReject", prefix);
> +        snprintf(buf, bufsize, "%sBKReject", prefix);
>          break;
>      case XkbAXN_AXKWarning:
> -        sprintf(buf, "%sAXKWarning", prefix);
> +        snprintf(buf, bufsize, "%sAXKWarning", prefix);
>          break;
>      default:
> -        sprintf(buf, "ILLEGAL");
> +        snprintf(buf, bufsize, "ILLEGAL");
>          break;
>      }
>      return buf;
> @@ -742,18 +750,19 @@ XkbGeomFPText(int val, unsigned format)
>  {
>      int whole, frac;
>      char *buf;
> +    const int bufsize = 12;
>  
> -    buf = tbGetBuffer(12);
> +    buf = tbGetBuffer(bufsize);
>      if (format == XkbCFile) {
> -        sprintf(buf, "%d", val);
> +        snprintf(buf, bufsize, "%d", val);
>      }
>      else {
>          whole = val / XkbGeomPtsPerMM;
>          frac = val % XkbGeomPtsPerMM;
>          if (frac != 0)
> -            sprintf(buf, "%d.%d", whole, frac);
> +            snprintf(buf, bufsize, "%d.%d", whole, frac);
>          else
> -            sprintf(buf, "%d", whole);
> +            snprintf(buf, bufsize, "%d", whole);
>      }
>      return buf;
>  }
> @@ -764,7 +773,8 @@ XkbDoodadTypeText(unsigned type, unsigned format)
>      char *buf;
>  
>      if (format == XkbCFile) {
> -        buf = tbGetBuffer(24);
> +        const int bufsize = 24;
> +        buf = tbGetBuffer(bufsize);
>          if (type == XkbOutlineDoodad)
>              strcpy(buf, "XkbOutlineDoodad");
>          else if (type == XkbSolidDoodad)
> @@ -776,10 +786,11 @@ XkbDoodadTypeText(unsigned type, unsigned format)
>          else if (type == XkbLogoDoodad)
>              strcpy(buf, "XkbLogoDoodad");
>          else
> -            sprintf(buf, "UnknownDoodad%d", type);
> +            snprintf(buf, bufsize, "UnknownDoodad%d", type);
>      }
>      else {
> -        buf = tbGetBuffer(12);
> +        const int bufsize = 12;
> +        buf = tbGetBuffer(bufsize);
>          if (type == XkbOutlineDoodad)
>              strcpy(buf, "outline");
>          else if (type == XkbSolidDoodad)
> @@ -791,7 +802,7 @@ XkbDoodadTypeText(unsigned type, unsigned format)
>          else if (type == XkbLogoDoodad)
>              strcpy(buf, "logo");
>          else
> -            sprintf(buf, "unknown%d", type);
> +            snprintf(buf, bufsize, "unknown%d", type);
>      }
>      return buf;
>  }
> @@ -820,12 +831,12 @@ XkbActionTypeText(unsigned type, unsigned format)
>      if (type <= XkbSA_LastAction) {
>          rtrn = actionTypeNames[type];
>          if (format == XkbCFile) {
> -            sprintf(buf, "XkbSA_%s", rtrn);
> +            snprintf(buf, sizeof(buf), "XkbSA_%s", rtrn);
>              return buf;
>          }
>          return rtrn;
>      }
> -    sprintf(buf, "Private");
> +    snprintf(buf, sizeof(buf), "Private");
>      return buf;
>  }
>  
> @@ -895,11 +906,11 @@ CopyGroupActionArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>      act = &action->group;
>      TryCopyStr(buf, "group=", sz);
>      if (act->flags & XkbSA_GroupAbsolute)
> -        sprintf(tbuf, "%d", XkbSAGroup(act) + 1);
> +        snprintf(tbuf, sizeof(buf), "%d", XkbSAGroup(act) + 1);
>      else if (XkbSAGroup(act) < 0)
> -        sprintf(tbuf, "%d", XkbSAGroup(act));
> +        snprintf(tbuf, sizeof(buf), "%d", XkbSAGroup(act));
>      else
> -        sprintf(tbuf, "+%d", XkbSAGroup(act));
> +        snprintf(tbuf, sizeof(buf), "+%d", XkbSAGroup(act));
>      TryCopyStr(buf, tbuf, sz);
>      if (act->type == XkbSA_LockGroup)
>          return True;
> @@ -923,15 +934,15 @@ CopyMovePtrArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>      x = XkbPtrActionX(act);
>      y = XkbPtrActionY(act);
>      if ((act->flags & XkbSA_MoveAbsoluteX) || (x < 0))
> -        sprintf(tbuf, "x=%d", x);
> +        snprintf(tbuf, sizeof(tbuf), "x=%d", x);
>      else
> -        sprintf(tbuf, "x=+%d", x);
> +        snprintf(tbuf, sizeof(tbuf), "x=+%d", x);
>      TryCopyStr(buf, tbuf, sz);
>  
>      if ((act->flags & XkbSA_MoveAbsoluteY) || (y < 0))
> -        sprintf(tbuf, ",y=%d", y);
> +        snprintf(tbuf, sizeof(tbuf), ",y=%d", y);
>      else
> -        sprintf(tbuf, ",y=+%d", y);
> +        snprintf(tbuf, sizeof(tbuf), ",y=+%d", y);
>      TryCopyStr(buf, tbuf, sz);
>      if (act->flags & XkbSA_NoAcceleration)
>          TryCopyStr(buf, ",!accel", sz);
> @@ -949,28 +960,28 @@ CopyPtrBtnArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>      act = &action->btn;
>      TryCopyStr(buf, "button=", sz);
>      if ((act->button > 0) && (act->button < 6)) {
> -        sprintf(tbuf, "%d", act->button);
> +        snprintf(tbuf, sizeof(tbuf), "%d", act->button);
>          TryCopyStr(buf, tbuf, sz);
>      }
>      else
>          TryCopyStr(buf, "default", sz);
>      if (act->count > 0) {
> -        sprintf(tbuf, ",count=%d", act->count);
> +        snprintf(tbuf, sizeof(tbuf), ",count=%d", act->count);
>          TryCopyStr(buf, tbuf, sz);
>      }
>      if (action->type == XkbSA_LockPtrBtn) {
>          switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) {
>          case XkbSA_LockNoLock:
> -            sprintf(tbuf, ",affect=unlock");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=unlock");
>              break;
>          case XkbSA_LockNoUnlock:
> -            sprintf(tbuf, ",affect=lock");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=lock");
>              break;
>          case XkbSA_LockNoUnlock | XkbSA_LockNoLock:
> -            sprintf(tbuf, ",affect=neither");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=neither");
>              break;
>          default:
> -            sprintf(tbuf, ",affect=both");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=both");
>              break;
>          }
>          TryCopyStr(buf, tbuf, sz);
> @@ -991,9 +1002,9 @@ CopySetPtrDfltArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>          TryCopyStr(buf, "affect=button,button=", sz);
>          if ((act->flags & XkbSA_DfltBtnAbsolute) ||
>              (XkbSAPtrDfltValue(act) < 0))
> -            sprintf(tbuf, "%d", XkbSAPtrDfltValue(act));
> +            snprintf(tbuf, sizeof(tbuf), "%d", XkbSAPtrDfltValue(act));
>          else
> -            sprintf(tbuf, "+%d", XkbSAPtrDfltValue(act));
> +            snprintf(tbuf, sizeof(tbuf), "+%d", XkbSAPtrDfltValue(act));
>          TryCopyStr(buf, tbuf, sz);
>      }
>      return True;
> @@ -1010,11 +1021,11 @@ CopyISOLockArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>      if (act->flags & XkbSA_ISODfltIsGroup) {
>          TryCopyStr(tbuf, "group=", sz);
>          if (act->flags & XkbSA_GroupAbsolute)
> -            sprintf(tbuf, "%d", XkbSAGroup(act) + 1);
> +            snprintf(tbuf, sizeof(tbuf), "%d", XkbSAGroup(act) + 1);
>          else if (XkbSAGroup(act) < 0)
> -            sprintf(tbuf, "%d", XkbSAGroup(act));
> +            snprintf(tbuf, sizeof(tbuf), "%d", XkbSAGroup(act));
>          else
> -            sprintf(tbuf, "+%d", XkbSAGroup(act));
> +            snprintf(tbuf, sizeof(tbuf), "+%d", XkbSAGroup(act));
>          TryCopyStr(buf, tbuf, sz);
>      }
>      else {
> @@ -1048,17 +1059,17 @@ CopyISOLockArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>              nOut++;
>          }
>          if ((act->affect & XkbSA_ISONoAffectGroup) == 0) {
> -            sprintf(tbuf, "%sgroups", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sgroups", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if ((act->affect & XkbSA_ISONoAffectPtr) == 0) {
> -            sprintf(tbuf, "%spointer", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%spointer", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if ((act->affect & XkbSA_ISONoAffectCtrls) == 0) {
> -            sprintf(tbuf, "%scontrols", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%scontrols", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
> @@ -1076,9 +1087,9 @@ CopySwitchScreenArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>  
>      act = &action->screen;
>      if ((act->flags & XkbSA_SwitchAbsolute) || (XkbSAScreen(act) < 0))
> -        sprintf(tbuf, "screen=%d", XkbSAScreen(act));
> +        snprintf(tbuf, sizeof(tbuf), "screen=%d", XkbSAScreen(act));
>      else
> -        sprintf(tbuf, "screen=+%d", XkbSAScreen(act));
> +        snprintf(tbuf, sizeof(tbuf), "screen=+%d", XkbSAScreen(act));
>      TryCopyStr(buf, tbuf, sz);
>      if (act->flags & XkbSA_SwitchApplication)
>          TryCopyStr(buf, ",!same", sz);
> @@ -1107,67 +1118,67 @@ CopySetLockControlsArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>          int nOut = 0;
>  
>          if (tmp & XkbRepeatKeysMask) {
> -            sprintf(tbuf, "%sRepeatKeys", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sRepeatKeys", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbSlowKeysMask) {
> -            sprintf(tbuf, "%sSlowKeys", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sSlowKeys", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbBounceKeysMask) {
> -            sprintf(tbuf, "%sBounceKeys", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sBounceKeys", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbStickyKeysMask) {
> -            sprintf(tbuf, "%sStickyKeys", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sStickyKeys", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbMouseKeysMask) {
> -            sprintf(tbuf, "%sMouseKeys", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sMouseKeys", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbMouseKeysAccelMask) {
> -            sprintf(tbuf, "%sMouseKeysAccel", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sMouseKeysAccel", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbAccessXKeysMask) {
> -            sprintf(tbuf, "%sAccessXKeys", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sAccessXKeys", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbAccessXTimeoutMask) {
> -            sprintf(tbuf, "%sAccessXTimeout", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sAccessXTimeout", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbAccessXFeedbackMask) {
> -            sprintf(tbuf, "%sAccessXFeedback", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sAccessXFeedback", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbAudibleBellMask) {
> -            sprintf(tbuf, "%sAudibleBell", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sAudibleBell", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbOverlay1Mask) {
> -            sprintf(tbuf, "%sOverlay1", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sOverlay1", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbOverlay2Mask) {
> -            sprintf(tbuf, "%sOverlay2", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sOverlay2", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
>          if (tmp & XkbIgnoreGroupLockMask) {
> -            sprintf(tbuf, "%sIgnoreGroupLock", (nOut > 0 ? "+" : ""));
> +            snprintf(tbuf, sizeof(tbuf), "%sIgnoreGroupLock", (nOut > 0 ? "+" : ""));
>              TryCopyStr(buf, tbuf, sz);
>              nOut++;
>          }
> @@ -1195,17 +1206,17 @@ CopyActionMessageArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>          TryCopyStr(buf, "KeyPress", sz);
>      else
>          TryCopyStr(buf, "KeyRelease", sz);
> -    sprintf(tbuf, ",data[0]=0x%02x", act->message[0]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[0]=0x%02x", act->message[0]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[1]=0x%02x", act->message[1]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[1]=0x%02x", act->message[1]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[2]=0x%02x", act->message[2]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[2]=0x%02x", act->message[2]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[3]=0x%02x", act->message[3]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[3]=0x%02x", act->message[3]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[4]=0x%02x", act->message[4]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[4]=0x%02x", act->message[4]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[5]=0x%02x", act->message[5]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[5]=0x%02x", act->message[5]);
>      TryCopyStr(buf, tbuf, sz);
>      return True;
>  }
> @@ -1228,10 +1239,10 @@ CopyRedirectKeyArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>          char *kn;
>  
>          kn = XkbKeyNameText(xkb->names->keys[kc].name, XkbXKBFile);
> -        sprintf(tbuf, "key=%s", kn);
> +        snprintf(tbuf, sizeof(tbuf), "key=%s", kn);
>      }
>      else
> -        sprintf(tbuf, "key=%d", kc);
> +        snprintf(tbuf, sizeof(tbuf), "key=%d", kc);
>      TryCopyStr(buf, tbuf, sz);
>      if ((act->mods_mask == 0) && (vmods_mask == 0))
>          return True;
> @@ -1267,28 +1278,28 @@ CopyDeviceBtnArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>      char tbuf[32];
>  
>      act = &action->devbtn;
> -    sprintf(tbuf, "device= %d", act->device);
> +    snprintf(tbuf, sizeof(tbuf), "device= %d", act->device);
>      TryCopyStr(buf, tbuf, sz);
>      TryCopyStr(buf, ",button=", sz);
> -    sprintf(tbuf, "%d", act->button);
> +    snprintf(tbuf, sizeof(tbuf), "%d", act->button);
>      TryCopyStr(buf, tbuf, sz);
>      if (act->count > 0) {
> -        sprintf(tbuf, ",count=%d", act->count);
> +        snprintf(tbuf, sizeof(tbuf), ",count=%d", act->count);
>          TryCopyStr(buf, tbuf, sz);
>      }
>      if (action->type == XkbSA_LockDeviceBtn) {
>          switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) {
>          case XkbSA_LockNoLock:
> -            sprintf(tbuf, ",affect=unlock");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=unlock");
>              break;
>          case XkbSA_LockNoUnlock:
> -            sprintf(tbuf, ",affect=lock");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=lock");
>              break;
>          case XkbSA_LockNoUnlock | XkbSA_LockNoLock:
> -            sprintf(tbuf, ",affect=neither");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=neither");
>              break;
>          default:
> -            sprintf(tbuf, ",affect=both");
> +            snprintf(tbuf, sizeof(tbuf), ",affect=both");
>              break;
>          }
>          TryCopyStr(buf, tbuf, sz);
> @@ -1305,21 +1316,21 @@ CopyOtherArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
>      char tbuf[32];
>  
>      act = &action->any;
> -    sprintf(tbuf, "type=0x%02x", act->type);
> +    snprintf(tbuf, sizeof(tbuf), "type=0x%02x", act->type);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[0]=0x%02x", act->data[0]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[0]=0x%02x", act->data[0]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[1]=0x%02x", act->data[1]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[1]=0x%02x", act->data[1]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[2]=0x%02x", act->data[2]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[2]=0x%02x", act->data[2]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[3]=0x%02x", act->data[3]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[3]=0x%02x", act->data[3]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[4]=0x%02x", act->data[4]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[4]=0x%02x", act->data[4]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[5]=0x%02x", act->data[5]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[5]=0x%02x", act->data[5]);
>      TryCopyStr(buf, tbuf, sz);
> -    sprintf(tbuf, ",data[6]=0x%02x", act->data[6]);
> +    snprintf(tbuf, sizeof(tbuf), ",data[6]=0x%02x", act->data[6]);
>      TryCopyStr(buf, tbuf, sz);
>      return True;
>  }
> @@ -1363,7 +1374,7 @@ XkbActionText(Display *dpy, XkbDescPtr xkb, XkbAction *action, unsigned format)
>      int sz;
>  
>      if (format == XkbCFile) {
> -        sprintf(buf,
> +        snprintf(buf, sizeof(buf),
>                  "{ %20s, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x } }",
>                  XkbActionTypeText(action->type, XkbCFile),
>                  action->any.data[0], action->any.data[1], action->any.data[2],
> @@ -1371,7 +1382,8 @@ XkbActionText(Display *dpy, XkbDescPtr xkb, XkbAction *action, unsigned format)
>                  action->any.data[6]);
>      }
>      else {
> -        sprintf(buf, "%s(", XkbActionTypeText(action->type, XkbXKBFile));
> +        snprintf(buf, sizeof(buf),
> +                 "%s(", XkbActionTypeText(action->type, XkbXKBFile));
>          sz = ACTION_SZ - strlen(buf) + 2;       /* room for close paren and NULL */
>          if (action->type < (unsigned) XkbSA_NumActions)
>              (*copyActionArgs[action->type]) (dpy, xkb, action, buf, &sz);
> @@ -1392,9 +1404,9 @@ XkbBehaviorText(XkbDescPtr xkb, XkbBehavior * behavior, unsigned format)
>  
>      if (format == XkbCFile) {
>          if (behavior->type == XkbKB_Default)
> -            sprintf(buf, "{   0,    0 }");
> +            snprintf(buf, sizeof(buf), "{   0,    0 }");
>          else
> -            sprintf(buf, "{ %3d, 0x%02x }", behavior->type, behavior->data);
> +            snprintf(buf, sizeof(buf), "{ %3d, 0x%02x }", behavior->type, behavior->data);
>      }
>      else {
>          unsigned type, permanent;
> @@ -1403,23 +1415,25 @@ XkbBehaviorText(XkbDescPtr xkb, XkbBehavior * behavior, unsigned format)
>          permanent = ((behavior->type & XkbKB_Permanent) != 0);
>  
>          if (type == XkbKB_Lock) {
> -            sprintf(buf, "lock= %s", (permanent ? "Permanent" : "True"));
> +            snprintf(buf, sizeof(buf), "lock= %s", (permanent ? "Permanent" : "True"));
>          }
>          else if (type == XkbKB_RadioGroup) {
>              int g;
>              char *tmp;
> +            size_t tmpsize;
>  
>              g = ((behavior->data) & (~XkbKB_RGAllowNone)) + 1;
>              if (XkbKB_RGAllowNone & behavior->data) {
> -                sprintf(buf, "allowNone,");
> +                snprintf(buf, sizeof(buf), "allowNone,");
>                  tmp = &buf[strlen(buf)];
>              }
>              else
>                  tmp = buf;
> +            tmpsize = sizeof(buf) - (tmp - buf);
>              if (permanent)
> -                sprintf(tmp, "permanentRadioGroup= %d", g);
> +                snprintf(tmp, tmpsize, "permanentRadioGroup= %d", g);
>              else
> -                sprintf(tmp, "radioGroup= %d", g);
> +                snprintf(tmp, tmpsize, "radioGroup= %d", g);
>          }
>          else if ((type == XkbKB_Overlay1) || (type == XkbKB_Overlay2)) {
>              int ndx, kc;
> @@ -1432,13 +1446,13 @@ XkbBehaviorText(XkbDescPtr xkb, XkbBehavior * behavior, unsigned format)
>              else {
>                  static char tbuf[8];
>  
> -                sprintf(tbuf, "%d", kc);
> +                snprintf(tbuf, sizeof(tbuf), "%d", kc);
>                  kn = tbuf;
>              }
>              if (permanent)
> -                sprintf(buf, "permanentOverlay%d= %s", ndx, kn);
> +                snprintf(buf, sizeof(buf), "permanentOverlay%d= %s", ndx, kn);
>              else
> -                sprintf(buf, "overlay%d= %s", ndx, kn);
> +                snprintf(buf, sizeof(buf), "overlay%d= %s", ndx, kn);
>          }
>      }
>      tmp = tbGetBuffer(strlen(buf) + 1);


More information about the xorg-devel mailing list