about summary refs log tree commit diff
path: root/resolv/ns_name_pton.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-07-19 07:55:27 +0200
committerFlorian Weimer <fweimer@redhat.com>2021-07-19 07:56:21 +0200
commit276e9822b3402d49a3c9bea713f89dc855812152 (patch)
tree1599a1be8b294d39144157e6ac701b19095b8f03 /resolv/ns_name_pton.c
parent4e1d3db1e86804283cd21f3186e06d397284ac70 (diff)
downloadglibc-276e9822b3402d49a3c9bea713f89dc855812152.tar.gz
glibc-276e9822b3402d49a3c9bea713f89dc855812152.tar.xz
glibc-276e9822b3402d49a3c9bea713f89dc855812152.zip
resolv: Move ns_name_pton into its own file and into libc
And reformat to GNU style, and eliminate the digits variable.

The symbol was moved using scripts/move-symbol-to-libc.py.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'resolv/ns_name_pton.c')
-rw-r--r--resolv/ns_name_pton.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/resolv/ns_name_pton.c b/resolv/ns_name_pton.c
new file mode 100644
index 0000000000..16f8ec8303
--- /dev/null
+++ b/resolv/ns_name_pton.c
@@ -0,0 +1,157 @@
+/* Convert a DNS domain name from presentation to wire format.
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <arpa/nameser.h>
+#include <errno.h>
+#include <shlib-compat.h>
+
+/* Converts an ASCII string into an encoded domain name as per
+   RFC1035.  Returns -1 if it fails, 1 if string was fully qualified,
+   0 is string was not fully qualified.  Enforces label and domain
+   length limits.  */
+int
+___ns_name_pton (const char *src, unsigned char *dst, size_t dstsiz)
+{
+  unsigned char *label, *bp, *eom;
+  int c, n, escaped;
+
+  escaped = 0;
+  bp = dst;
+  eom = dst + dstsiz;
+  label = bp++;
+
+  while ((c = *src++) != 0)
+    {
+      if (escaped)
+        {
+          if ('0' <= c && c <= '9')
+            {
+              n = (c - '0') * 100;
+              if ((c = *src++) == 0 || c < '0' || c > '9')
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              n += (c - '0') * 10;
+              if ((c = *src++) == 0 || c < '0' || c > '9')
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              n += c - '0';
+              if (n > 255)
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              c = n;
+            }
+          escaped = 0;
+        }
+      else if (c == '\\')
+        {
+          escaped = 1;
+          continue;
+        }
+      else if (c == '.')
+        {
+          c = (bp - label - 1);
+          if ((c & NS_CMPRSFLGS) != 0) /* Label too big.  */
+            {
+              __set_errno (EMSGSIZE);
+              return -1;
+            }
+          if (label >= eom)
+            {
+              __set_errno (EMSGSIZE);
+              return -1;
+            }
+          *label = c;
+          /* Fully qualified ? */
+          if (*src == '\0')
+            {
+              if (c != 0)
+                {
+                  if (bp >= eom)
+                    {
+                      __set_errno (EMSGSIZE);
+                      return -1;
+                    }
+                  *bp++ = '\0';
+                }
+              if ((bp - dst) > MAXCDNAME)
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              return 1;
+            }
+          if (c == 0 || *src == '.')
+            {
+              __set_errno (EMSGSIZE);
+              return -1;
+            }
+          label = bp++;
+          continue;
+        }
+      if (bp >= eom)
+        {
+          __set_errno (EMSGSIZE);
+          return -1;
+        }
+      *bp++ = (unsigned char) c;
+    }
+  if (escaped)                  /* Trailing backslash.  */
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  c = (bp - label - 1);
+  if ((c & NS_CMPRSFLGS) != 0)  /* Label too big.  */
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  if (label >= eom)
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  *label = c;
+  if (c != 0)
+    {
+      if (bp >= eom)
+        {
+          __set_errno (EMSGSIZE);
+          return -1;
+        }
+      *bp++ = 0;
+    }
+  if ((bp - dst) > MAXCDNAME)   /* src too big.  */
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  return 0;
+}
+versioned_symbol (libc, ___ns_name_pton, ns_name_pton, GLIBC_2_34);
+versioned_symbol (libc, ___ns_name_pton, __ns_name_pton, GLIBC_PRIVATE);
+libc_hidden_ver (___ns_name_pton, __ns_name_pton)
+
+#if OTHER_SHLIB_COMPAT (libresolv, GLIBC_2_9, GLIBC_2_34)
+compat_symbol (libresolv, ___ns_name_pton, ns_name_pton, GLIBC_2_9);
+#endif