Do i just sign it with B? it being internal?
You have two transactions: A->B (that is signed by A), and B->C (signed by B). It is that simple.
I have a txn which comes back with a stack error
If there is a stack error, then the transaction is invalid, and should be treated as invalid, so not relayed, not mined, and no block should be accepted if it contains any such transaction.