1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
.TH MEMORY 2
.SH NAME
memccpy, memchr, memcmp, memcpy, memmove, memset, tsmemcmp \- memory operations
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.PP
.ta \w'\fLvoid* 'u
.B
void* memccpy(void *s1, void *s2, int c, ulong n)
.PP
.B
void* memchr(void *s, int c, ulong n)
.PP
.B
int memcmp(void *s1, void *s2, ulong n)
.PP
.B
void* memcpy(void *s1, void *s2, ulong n)
.PP
.B
void* memmove(void *s1, void *s2, ulong n)
.PP
.B
void* memset(void *s, int c, ulong n)
.PP
.B #include <libsec.h>
.PP
.B
int tsmemcmp(void *s1, void *s2, ulong n)
.SH DESCRIPTION
These functions operate efficiently on memory areas
(arrays of bytes bounded by a count, not terminated by a zero byte).
They do not check for the overflow of any receiving memory area.
.PP
.I Memccpy
copies bytes from memory area
.I s2
into
.IR s1 ,
stopping after the first occurrence of byte
.I c
has been copied, or after
.I n
bytes have been copied, whichever comes first.
It returns a pointer to the byte after
the copy of
.I c
in
.IR s1 ,
or zero if
.I c
was not found in the first
.I n
bytes of
.IR s2 .
.PP
.I Memchr
returns a pointer to the first
occurrence of byte
.I c
in the first
.I n
bytes of memory area
.IR s,
or zero if
.I c
does not occur.
.PP
.I Memcmp
compares its arguments, looking at the first
.I n
bytes only, and returns an integer
less than, equal to, or greater than 0,
according as
.I s1
is lexicographically less than, equal to, or
greater than
.IR s2 .
The comparison is bytewise unsigned.
.PP
.I Memcpy
copies
.I n
bytes from memory area
.I s2
to
.IR s1 .
It returns
.IR s1 .
.PP
.I Memmove
works like
.IR memcpy ,
except that it is guaranteed to work if
.I s1
and
.IR s2
overlap.
.PP
.I Memset
sets the first
.I n
bytes in memory area
.I s
to the value of byte
.IR c .
It returns
.IR s .
.PP
.I Tsmemcmp
is a variant of
.I memcmp
that is safe against timing attacks.
It does not stop when it sees a difference, this way it's runtime is function of
.I n
and not something that can lead clues to attackers.
.SH SOURCE
All these routines have portable C implementations in
.BR /sys/src/libc/port .
Most also have machine-dependent assembly language implementations in
.BR /sys/src/libc/$objtype .
.I Tsmemcmp
is found on
.BR /sys/src/libsec/port/tsmemcmp.c .
.SH SEE ALSO
.IR strcat (2)
.SH BUGS
ANSI C does not require
.I memcpy
to handle overlapping source and destination; on Plan 9, it does, so
.I memmove
and
.I memcpy
behave identically.
.PP
If
.I memcpy
and
.I memmove
are handed a negative count, they abort.
.PP
.I Memcmp
should not be used to compare sensitive data as it's vulnerable to timing attacks. Instead,
.I tsmemcmp
should be used.
|