Blame sysdeps/unix/sysv/linux/mips/____longjmp_chk.c

Packit 6c4009
/* Copyright (C) 2009-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library.  If not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <signal.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#define __longjmp ____longjmp_chk
Packit 6c4009
#define CHECK_SP(saved_sp, cur_sp, sp_type)				\
Packit 6c4009
  do {									\
Packit 6c4009
    sp_type sp_saved = (sp_type) (saved_sp);				\
Packit 6c4009
    if (sp_saved < (cur_sp))						\
Packit 6c4009
      {									\
Packit 6c4009
	struct __jmp_buf_internal_tag *env_save = env_arg;		\
Packit 6c4009
	int val_save = val_arg;						\
Packit 6c4009
	stack_t ss;							\
Packit 6c4009
	int ret = __sigaltstack (NULL, &ss);				\
Packit 6c4009
	if (ret == 0							\
Packit 6c4009
	    && (!(ss.ss_flags & SS_ONSTACK)				\
Packit 6c4009
		|| ((unsigned sp_type) ((sp_type) (long) ss.ss_sp	\
Packit 6c4009
					+ (sp_type) ss.ss_size		\
Packit 6c4009
					- sp_saved)			\
Packit 6c4009
		    < ss.ss_size)))					\
Packit 6c4009
	  __fortify_fail ("longjmp causes uninitialized stack frame");	\
Packit 6c4009
	asm volatile ("move %0, %1" : "=r" (env) : "r" (env_save));	\
Packit 6c4009
	asm volatile ("move %0, %1" : "=r" (val) : "r" (val_save));	\
Packit 6c4009
      }									\
Packit 6c4009
  } while (0)
Packit 6c4009
#include <__longjmp.c>