Print this page
5366 strcoll_l may destroy its arguments, then crash


  22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26  * SUCH DAMAGE.
  27  */
  28 
  29 #include "lint.h"
  30 #include <limits.h>
  31 #include <stdlib.h>
  32 #include <wchar.h>
  33 #include <locale.h>
  34 #include "mblocal.h"
  35 #include "localeimpl.h"
  36 #include "lctype.h"
  37 
  38 size_t
  39 mbstowcs_l(wchar_t *_RESTRICT_KYWD pwcs, const char *_RESTRICT_KYWD s,
  40     size_t n, locale_t loc)
  41 {
  42         static const mbstate_t initial = { 0 };
  43         mbstate_t mbs;
  44         const char *sp;
  45 
  46         mbs = initial;
  47         sp = s;
  48         return (loc->ctype->lc_mbsnrtowcs(pwcs, &sp, ULONG_MAX, n, &mbs));
  49 }
  50 
  51 size_t
  52 mbstowcs(wchar_t *_RESTRICT_KYWD pwcs, const char *_RESTRICT_KYWD s, size_t n)
  53 {
  54         return (mbstowcs_l(pwcs, s, n, uselocale(NULL)));
  55 }


  22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26  * SUCH DAMAGE.
  27  */
  28 
  29 #include "lint.h"
  30 #include <limits.h>
  31 #include <stdlib.h>
  32 #include <wchar.h>
  33 #include <locale.h>
  34 #include "mblocal.h"
  35 #include "localeimpl.h"
  36 #include "lctype.h"
  37 
  38 size_t
  39 mbstowcs_l(wchar_t *_RESTRICT_KYWD pwcs, const char *_RESTRICT_KYWD s,
  40     size_t n, locale_t loc)
  41 {
  42         mbstate_t mbs = { 0 };

  43         const char *sp;
  44 

  45         sp = s;
  46         return (loc->ctype->lc_mbsnrtowcs(pwcs, &sp, ULONG_MAX, n, &mbs));
  47 }
  48 
  49 size_t
  50 mbstowcs(wchar_t *_RESTRICT_KYWD pwcs, const char *_RESTRICT_KYWD s, size_t n)
  51 {
  52         return (mbstowcs_l(pwcs, s, n, uselocale(NULL)));
  53 }