submitted-resolv-unaligned

Gbp-Pq: Topic any
Gbp-Pq: Name submitted-resolv-unaligned.diff
This commit is contained in:
Ubuntu Developers 2022-05-13 23:32:11 +08:00 committed by openKylinBot
parent 6df96e6647
commit 1a51c85b7a
3 changed files with 31 additions and 5 deletions

View File

@ -95,6 +95,15 @@
#include <shlib-compat.h> #include <shlib-compat.h>
#include <random-bits.h> #include <random-bits.h>
/* The structure HEADER is normally aligned to a word boundary and its
fields are accessed using word loads and stores. We need to access
this structure when it is aligned on a byte boundary. This can cause
problems on machines with strict alignment. So, we create a new
typedef to reduce its alignment to one. This ensures the fields are
accessed with byte loads and stores. */
typedef HEADER __attribute__ ((__aligned__(1))) UHEADER;
#define HEADER UHEADER
int int
__res_context_mkquery (struct resolv_context *ctx, int op, const char *dname, __res_context_mkquery (struct resolv_context *ctx, int op, const char *dname,
int class, int type, const unsigned char *data, int class, int type, const unsigned char *data,

View File

@ -81,6 +81,14 @@
#include <string.h> #include <string.h>
#include <shlib-compat.h> #include <shlib-compat.h>
/* The structure HEADER is normally aligned to a word boundary and its
fields are accessed using word loads and stores. We need to access
this structure when it is aligned on a byte boundary. This can cause
problems on machines with strict alignment. So, we create a new
typedef to reduce its alignment to one. This ensures the fields are
accessed with byte loads and stores. */
typedef HEADER __attribute__ ((__aligned__(1))) UHEADER;
#if PACKETSZ > 65536 #if PACKETSZ > 65536
#define MAXPACKET PACKETSZ #define MAXPACKET PACKETSZ
#else #else
@ -112,8 +120,8 @@ __res_context_query (struct resolv_context *ctx, const char *name,
int *nanswerp2, int *resplen2, int *answerp2_malloced) int *nanswerp2, int *resplen2, int *answerp2_malloced)
{ {
struct __res_state *statp = ctx->resp; struct __res_state *statp = ctx->resp;
HEADER *hp = (HEADER *) answer; UHEADER *hp = (UHEADER *) answer;
HEADER *hp2; UHEADER *hp2;
int n, use_malloc = 0; int n, use_malloc = 0;
size_t bufsize = (type == T_QUERY_A_AND_AAAA ? 2 : 1) * QUERYSIZE; size_t bufsize = (type == T_QUERY_A_AND_AAAA ? 2 : 1) * QUERYSIZE;
@ -217,7 +225,7 @@ __res_context_query (struct resolv_context *ctx, const char *name,
if (answerp != NULL) if (answerp != NULL)
/* __res_context_send might have reallocated the buffer. */ /* __res_context_send might have reallocated the buffer. */
hp = (HEADER *) *answerp; hp = (UHEADER *) *answerp;
/* We simplify the following tests by assigning HP to HP2 or /* We simplify the following tests by assigning HP to HP2 or
vice versa. It is easy to verify that this is the same as vice versa. It is easy to verify that this is the same as
@ -228,7 +236,7 @@ __res_context_query (struct resolv_context *ctx, const char *name,
} }
else else
{ {
hp2 = (HEADER *) *answerp2; hp2 = (UHEADER *) *answerp2;
if (n < (int) sizeof (HEADER)) if (n < (int) sizeof (HEADER))
{ {
hp = hp2; hp = hp2;
@ -327,7 +335,7 @@ __res_context_search (struct resolv_context *ctx,
{ {
struct __res_state *statp = ctx->resp; struct __res_state *statp = ctx->resp;
const char *cp; const char *cp;
HEADER *hp = (HEADER *) answer; UHEADER *hp = (UHEADER *) answer;
char tmp[NS_MAXDNAME]; char tmp[NS_MAXDNAME];
u_int dots; u_int dots;
int trailing_dot, ret, saved_herrno; int trailing_dot, ret, saved_herrno;

View File

@ -111,6 +111,15 @@
#include <libc-diag.h> #include <libc-diag.h>
#include <random-bits.h> #include <random-bits.h>
/* The structure HEADER is normally aligned to a word boundary and its
fields are accessed using word loads and stores. We need to access
this structure when it is aligned on a byte boundary. This can cause
problems on machines with strict alignment. So, we create a new
typedef to reduce its alignment to one. This ensures the fields are
accessed with byte loads and stores. */
typedef HEADER __attribute__ ((__aligned__(1))) UHEADER;
#define HEADER UHEADER
#if PACKETSZ > 65536 #if PACKETSZ > 65536
#define MAXPACKET PACKETSZ #define MAXPACKET PACKETSZ
#else #else