Home
About
Blog
Products
Forum
Support
Contact
Sunbelt Computer Software
PL/B Language Development and Support
Home
About
Blog
Products
Forum
Support
Contact
PythonIniOS/Python-iOS/libPython/Python/mysnprintf.c at master · coderdreamworld/PythonIniOS · GitHub
Skip to content
Navigation Menu
Sign in
Appearance settings
Platform
AI CODE CREATION
GitHub Copilot
Write better code with AI
GitHub Copilot app
Direct agents from issue to merge
MCP Registry
Integrate external tools
DEVELOPER WORKFLOWS
Actions
Automate any workflow
Codespaces
Instant dev environments
Issues
Plan and track work
Code Review
Manage code changes
Code Quality
Enforce quality at merge
APPLICATION SECURITY
GitHub Advanced Security
Find and fix vulnerabilities
Code security
Secure your code as you build
Secret protection
Stop leaks before they start
EXPLORE
Why GitHub
Documentation
Blog
Changelog
Marketplace
View all features
Solutions
BY COMPANY SIZE
Enterprises
Small and medium teams
Startups
Nonprofits
BY USE CASE
App Modernization
DevSecOps
DevOps
CI/CD
View all use cases
BY INDUSTRY
Healthcare
Financial services
Manufacturing
Government
View all industries
View all solutions
Resources
EXPLORE BY TOPIC
AI
Software Development
DevOps
Security
View all topics
EXPLORE BY TYPE
Customer stories
Events & webinars
Ebooks & reports
Business insights
GitHub Skills
SUPPORT & SERVICES
Documentation
Customer support
Community forum
Trust center
Partners
View all resources
Open Source
COMMUNITY
GitHub Sponsors
Fund open source developers
PROGRAMS
Security Lab
Maintainer Community
GitHub Stars
Archive Program
REPOSITORIES
Topics
Trending
Collections
Enterprise
ENTERPRISE SOLUTIONS
Enterprise platform
AI-powered developer platform
AVAILABLE ADD-ONS
GitHub Advanced Security
Enterprise-grade security features
Copilot for Business
Enterprise-grade AI features
Premium Support
Enterprise-grade 24/7 support
Pricing
Search
/
Sign in
Sign up
Appearance settings
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
coderdreamworld
/
PythonIniOS
Public
forked from
koalahl/PythonIniOS
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Files
Expand file tree
master
Breadcrumbs
PythonIniOS
/
Python-iOS
/
libPython
/
Python
/
mysnprintf.c
Copy path
Blame
More file actions
Blame
More file actions
Latest commit
History
History
History
executable file
·
105 lines (89 loc) · 3.28 KB
master
Breadcrumbs
PythonIniOS
/
Python-iOS
/
libPython
/
Python
/
mysnprintf.c
Copy path
Top
File metadata and controls
Code
Blame
executable file
·
105 lines (89 loc) · 3.28 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
#include
"Python.h"
#include
<ctype.h>
/* snprintf() wrappers. If the platform has vsnprintf, we use it, else we
emulate it in a half-hearted way. Even if the platform has it, we wrap
it because platforms differ in what vsnprintf does in case the buffer
is too small: C99 behavior is to return the number of characters that
would have been written had the buffer not been too small, and to set
the last byte of the buffer to \0. At least MS _vsnprintf returns a
negative value instead, and fills the entire buffer with non-\0 data.
The wrappers ensure that str[size-1] is always \0 upon return.
PyOS_snprintf and PyOS_vsnprintf never write more than size bytes
(including the trailing '\0') into str.
If the platform doesn't have vsnprintf, and the buffer size needed to
avoid truncation exceeds size by more than 512, Python aborts with a
Py_FatalError.
Return value (rv):
When 0 <= rv < size, the output conversion was unexceptional, and
rv characters were written to str (excluding a trailing \0 byte at
str[rv]).
When rv >= size, output conversion was truncated, and a buffer of
size rv+1 would have been needed to avoid truncation. str[size-1]
is \0 in this case.
When rv < 0, "something bad happened". str[size-1] is \0 in this
case too, but the rest of str is unreliable. It could be that
an error in format codes was detected by libc, or on platforms
with a non-C99 vsnprintf simply that the buffer wasn't big enough
to avoid truncation, or on platforms without any vsnprintf that
PyMem_Malloc couldn't obtain space for a temp buffer.
CAUTION: Unlike C99, str != NULL and size > 0 are required.
*/
int
PyOS_snprintf
(
char
*
str
,
size_t
size
,
const
char
*
format
, ...)
{
int
rc
;
va_list
va
;
va_start
(
va
,
format
);
rc
=
PyOS_vsnprintf
(
str
,
size
,
format
,
va
);
va_end
(
va
);
return
rc
;
}
int
PyOS_vsnprintf
(
char
*
str
,
size_t
size
,
const
char
*
format
,
va_list
va
)
{
int
len
;
/* # bytes written, excluding \0 */
#ifdef
HAVE_SNPRINTF
#define
_PyOS_vsnprintf_EXTRA_SPACE
1
#else
#define
_PyOS_vsnprintf_EXTRA_SPACE
512
char
*
buffer
;
#endif
assert
(
str
!=
NULL
);
assert
(
size
>
0
);
assert
(
format
!=
NULL
);
/* We take a size_t as input but return an int. Sanity check
* our input so that it won't cause an overflow in the
* vsnprintf return value or the buffer malloc size. */
if
(
size
>
INT_MAX
-
_PyOS_vsnprintf_EXTRA_SPACE
) {
len
=
-666
;
goto
Done
;
}
#ifdef
HAVE_SNPRINTF
len
=
vsnprintf
(
str
,
size
,
format
,
va
);
#else
/* Emulate it. */
buffer
=
PyMem_MALLOC
(
size
+
_PyOS_vsnprintf_EXTRA_SPACE
);
if
(
buffer
==
NULL
) {
len
=
-666
;
goto
Done
;
}
len
=
vsprintf
(
buffer
,
format
,
va
);
if
(
len
<
0
)
/* ignore the error */
;
else
if
((
size_t
)
len
>=
size
+
_PyOS_vsnprintf_EXTRA_SPACE
)
Py_FatalError
(
"Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"
);
else
{
const
size_t
to_copy
=
(
size_t
)
len
<
size
?
(
size_t
)
len
:
size
-
1
;
assert
(
to_copy
<
size
);
memcpy
(
str
,
buffer
,
to_copy
);
str
[
to_copy
]
=
'\0'
;
}
PyMem_FREE
(
buffer
);
#endif
Done
:
if
(
size
>
0
)
str
[
size
-
1
]
=
'\0'
;
return
len
;
#undef
_PyOS_vsnprintf_EXTRA_SPACE
}
You can’t perform that action at this time.