safec
2.1
Safe C Library - ISO TR24731 Bounds Checking Interface
memcmp_s.c
Go to the documentation of this file.
1
/*------------------------------------------------------------------
2
* memcmp_s.c - Compares memory
3
*
4
* October 2008, Bo Berry
5
*
6
* Copyright (c) 2008-2011 Cisco Systems
7
* All rights reserved.
8
*
9
* Permission is hereby granted, free of charge, to any person
10
* obtaining a copy of this software and associated documentation
11
* files (the "Software"), to deal in the Software without
12
* restriction, including without limitation the rights to use,
13
* copy, modify, merge, publish, distribute, sublicense, and/or
14
* sell copies of the Software, and to permit persons to whom the
15
* Software is furnished to do so, subject to the following
16
* conditions:
17
*
18
* The above copyright notice and this permission notice shall be
19
* included in all copies or substantial portions of the Software.
20
*
21
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
23
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28
* OTHER DEALINGS IN THE SOFTWARE.
29
*------------------------------------------------------------------
30
*/
31
32
#include "safeclib_private.h"
33
#include "safe_mem_constraint.h"
34
#include "safe_mem_lib.h"
35
36
72
errno_t
73
memcmp_s
(
const
void
*dest, rsize_t dmax,
74
const
void
*src, rsize_t smax,
int
*diff)
75
{
76
const
uint8_t *dp;
77
const
uint8_t *sp;
78
79
dp = (uint8_t*) dest;
80
sp = (uint8_t*) src;
81
82
/*
83
* must be able to return the diff
84
*/
85
if
(diff == NULL) {
86
invoke_safe_mem_constraint_handler
(
"memcmp_s: diff is null"
,
87
NULL, ESNULLP);
88
return
(RCNEGATE(ESNULLP));
89
}
90
*diff = -1;
/* default diff */
91
92
if
(dp == NULL) {
93
invoke_safe_mem_constraint_handler
(
"memcmp_s: dest is null"
,
94
NULL, ESNULLP);
95
return
(RCNEGATE(ESNULLP));
96
}
97
98
if
(sp == NULL) {
99
invoke_safe_mem_constraint_handler
(
"memcmp_s: src is null"
,
100
NULL, ESNULLP);
101
return
(RCNEGATE(ESNULLP));
102
}
103
104
if
(dmax == 0) {
105
invoke_safe_mem_constraint_handler
(
"memcmp_s: dmax is 0"
,
106
NULL, ESZEROL);
107
return
(RCNEGATE(ESZEROL));
108
}
109
110
if
(dmax > RSIZE_MAX_MEM || smax > RSIZE_MAX_MEM) {
111
invoke_safe_mem_constraint_handler
(
"memcmp_s: dmax/smax exceeds max"
,
112
NULL, ESLEMAX);
113
return
(RCNEGATE(ESLEMAX));
114
}
115
116
if
(smax == 0) {
117
invoke_safe_mem_constraint_handler
(
"memcmp_s: smax is 0"
,
118
NULL, ESZEROL);
119
return
(RCNEGATE(ESZEROL));
120
}
121
122
if
(smax > dmax) {
123
invoke_safe_mem_constraint_handler
(
"memcmp_s: smax exceeds dmax"
,
124
NULL, ESNOSPC);
125
return
(RCNEGATE(ESNOSPC));
126
}
127
128
/*
129
* no need to compare the same memory
130
*/
131
if
(dp == sp) {
132
*diff = 0;
133
return
(RCNEGATE(EOK));
134
}
135
136
/*
137
* now compare sp to dp
138
*/
139
*diff = 0;
140
while
(dmax > 0 && smax > 0) {
141
if
(*dp != *sp) {
142
/*** *diff = *dp - *sp; ***/
143
*diff = *dp < *sp ? -1 : 1;
144
break
;
145
}
146
147
dmax--;
148
smax--;
149
150
dp++;
151
sp++;
152
}
153
154
return
(RCNEGATE(EOK));
155
}
156
EXPORT_SYMBOL(
memcmp_s
)
memcmp_s
errno_t memcmp_s(const void *dest, rsize_t dmax, const void *src, rsize_t smax, int *diff)
Compares memory until they differ, and their difference is returned in diff.
Definition:
memcmp_s.c:73
invoke_safe_mem_constraint_handler
void invoke_safe_mem_constraint_handler(const char *msg, void *ptr, errno_t error)
Invokes the currently set constraint handler or the default.
Definition:
safe_mem_constraint.c:95
Generated for Safe C Library 30082017.0-g85d10b 2.1 by
doxygen